public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [PATCH v11 00/29] Introduce the lwIP network stack
@ 2024-10-03 15:22 Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected Jerome Forissier
                   ` (31 more replies)
  0 siblings, 32 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier

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. and
Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE 

Notes

1. A number of features are currently incompatible with NET_LWIP:
DFU_TFTP, FASTBOOT, SPL_NET, ETH_SANDBOX, ETH_SANDBOX_RAW, DM_ETH. They
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.

2. Due to the above, and in order to provide some level of testing of the
lwIP code in CI even when the legacy NET is the default, a new QEMU
configuration is introduced (qemu_arm64_lwip_defconfig) which is
based on qemu_arm64_defconfig with NET_LWIP and CMD_*_LWIP enabled.
In addition to that, this series has some [TESTING] patches
which make NET_LWIP the default.

[1] https://lore.kernel.org/all/20231127125726.3735-1-maxim.uvarov@linaro.org/
[2] https://www.nongnu.org/lwip/
[3] https://en.wikipedia.org/wiki/LwIP

Changes in v11:

- Rebased onto next
- "Miscellaneous fixes" removed (patches were merged in next). The
series still begins with small fixes posted separately [1] [2] [3].
- Add (some) support for CMD_PXE and therefore drop patch "[TESTING]
configs: set CONFIG_NET=y when PXE is enabled". This is build-tested
only and it is very likely that some work is needed to make it useful.
For example, adding the code for DHCP option 209 to lwIP so that
BOOTP_PXE_DHCP_OPTION can be supported.
- SANDBOX is now supported, but with the dm eth and wget tests
disabled.
- Move eth_set_enable_bootdevs() declaration to net-common.h
Fixes warning with snow_defconfig:
test/test-main.c:310:17: warning: implicit declaration of function ‘eth_set_enable_bootdevs’ [....]
- Do eth_init() and eth_init_rings() only once, and do not forget
lwip_init()! Fixes TFTP stalls on TI K3 (reported by Tom R. and
tested by Ilias A.)
- Set MEM_ALIGNMENT to 8 in lib/lwip/u-boot/lwipopts.h. Fixes TFTP
random crashes on TI K3 (Ilias A.)
- net_lwip_rx(): call free_pkt() even when recv() has returned 0,
as required by the driver model documentation (and imx8mp_evk). Fixes
a regression introduced in v9. Goes together with patch [2].
- Add "lwip: tftp: bind to TFTP port only when in server mode" to
fix an issue with interrupted tftp commands (the tftp command hangs
if it is interrupted with Ctrl-C and started again).
- TFTP: fix uninitialized "ret" variable in do_tftpb(); print "Abort"
on Ctrl-C.
- MAINTAINERS: remove README and add sandbox ethernet driver to the
list of maintained files.
- AFAICT, CI should be all good except qemu_xtensa_dc233c which is
broken when NET_LWIP=y (QEMU just hangs with no output). I could
not find or build a suitable GDB binary to debug that.

[1] https://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
[2] https://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/ 
[3] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/

Changes in v10:

- Rebase onto next
- URL for lwIP changed in cover letter: using GitHub now since all
tags have suddenly disappeared from the repository on gnu.org.
- Post fixes as a separate series [1] or individual patches [2] [3]
- Add "if NET_LWIP" to net/lwip/Kconfig to fix a kconfig warning
  when doing the full branch build with buildman ("[NEW]")
- net/ is added to libs-y only when NET or NET_LWIP, not NO_NET
- Apply review tags

[1] http://patchwork.ozlabs.org/project/uboot/list/?series=422079
https://lists.denx.de/pipermail/u-boot/2024-September/563904.html
[2] http://patchwork.ozlabs.org/project/uboot/list/?series=421962
[3] http://patchwork.ozlabs.org/project/uboot/list/?series=421959
 
Changes in v9:

- Rebased onto master, reordered commits to put some fixes that are not
strictly related to lwIP first.
- New commit "test/py: test_efi_loader: add missing dependency on
cmd_tftpboot" (Tom R.)
- test_efi_loader.py: add missing dependency on cmd_wget (Tom R.)
- wget: fix divide by zero when transfer takes less than 1ms (Tom R.)
- New commit "configs: use syntax CONFIG_FOO=n in tools-only_defconfig"
(Tom R.)
- Make TCP_WND configurable (via CONFIG_LWIP_TCP_WND) because a large
value is needed for good performance especially with latency but 
transfers stall in QEMU (-net user) when the value is larger than a few
KB (Anton A., offlist)
- Added [TESTING] commits to run CI with NET_LWIP enabled by default
except for SANDBOX and platforms that enable PXE, and fixed a number of
issues:
  * coreboot_defconfig: 'implicit declaration' warnings on
    ip_checksum_ok() and compute_ip_checksum()
  * Fix EFI net tests (bootefi selftest) by adding missing
    push_packed() call to net_process_received_packet()
  * qemu_arm64: fix test_efi_loader.py failures (skip HTTP test
    by default since it needs a HTTP server; fix a bug in the dhcp
    command which would not set the "serverip" variable)
  * QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139:
    Fixed receive errors due to calling free_pkt() with a
    length of zero. r2dplus_tulip: fixed "dm_pci_phys_to_bus:
    invalid physical address" caused by too late eth_init_rings().
With that the CI status is all GREEN:
https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9225&view=results

Changes in v8:

- Fix bootefi with tftp and wget. It would previously fail with an
error message: "No UEFI binary known at 200000". Tested on Raspberry
3B+. Also fix the legacy wget. (Tom R.)
- wget: add "Bytes transferred =" message and accept legacy syntax
for better compatibility which also makes it easier to add a test to
the test suite
- wget: When no server name or address is supplied, use
${httpserverip} then ${serverip}.
- wget: start the timer used for measuring throughput when the first
data block is received. In other words: do not include DNS resolution
and TCP connection time in measurement. It gives better numbers ;)
but more importantly is how the legacy code works.
- wget: handle non-200 result codes from the server as errors.
- tftp: when no server name or ip is supplied, use ${tftpserverip}
then fall back to ${serverip}.
- New commit: "test/py: add HTTP (wget) test"
- New commit: "net: wget: removed unused function wget_success()"
- Change back all !CONFIG_IS_ENABLED(NO_NET) tests to
(CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)) since the
NO_NET case is wrong when CONFIG_SPL_BUILD or CONFIG_TPL_BUILD is
defined (Tom R.)

Changes in v7:

- Rebased onto master
- Updated binary size comparisons in this cover letter. Note that
the increase for imx8mp_evk_defconfig  was wrong due to a configuration
error.

Changes in v6:

- Rebased on next
- "flash: prefix error codes with FL_"
Update drivers/mtd/altera_qspi.c too (Tom R.)
- "net: introduce alternative implementation as net-lwip/"
Introduce a "Networking" top-level menu in the main Kconfig. Avoids
having a lot of network-related symbols on the first screen of
menuconfig. The "Networking stack" choice as well as the applicable
symbols (depending on the selected choice) are now all inside this
"Networking" menu. (Michal S.)
For PROT_DHCP_LWIP and PROT_DNS_LWIP, use "select" PROT_UDP_LWIP
rather than "depends on".
Move NET_RANDOM_ETHADDR to the common ('if NET || NET_LWIP') block.
Move SYS_RX_ETH_BUFFER out of 'if NET || NET_LWIP' since it is used
unguarded in some code (e.g., am62x_beagleplay_r5) (Tom R.).
- "net: split include/net.h into net{,-common,-legacy,-lwip}.h"
Move net_random_ethaddr() to net-common.h.
- "net: eth-uclass: add function eth_start_udev()"
Fix typo and apply Tom R.'s R-b.
- "net-lwip: add DHCP support and dhcp commmand"
Convert !CONFIG_IS_ENABLED(NET) to
CONFIG_IS_ENABLED(NO_NET) in board/xilinx/common/board.c
to fix an issue with device having no MAC address (thanks Michal S.).
Do the same at other places (icore_mx8mp.c, imx8mp_debix_model_a.c,
board/ti/am335x/board.c, tiny-printf.c).
Move CMD_MII and CMD_MDIO into 'if NET || NET_LWIP'.
- "net-lwip: add TFTP support and tftpboot command":
Fix help string.
- "net: split cmd/net.c into cmd/net.c and cmd/net-common.c":
Apply Ilias' R-b.
- "net-lwip: add TFTP_BLOCKSIZE"
Apply Ilias' R-b. I moved the TFTP_BLOCKSIZE Kconfig into this commit
where it belongs (it was previously in "net" split ... net.h").

Changes in v5:

- Rebased on next
- Refactor Kconfig options to avoid duplicates
- Library functions use a more consistent naming (dhcp_loop(),
ping_loop() etc.) and take a struct udevice * parameter (Heinrich S.)
- Do not use net_process_receive_packet() for input anymore. Instead of
calling eth_rx() which would invoke net_process_receive_packet(), we
call a new net_lwip_rx(udev) function which invokes the device recv()
and pushes the packets up the lwIP stack. Thus everything is tied to
a udevice now. (Heinrich S.)
- Add "configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y"
(Tom R.)
- tftp: unify display with legacy command: add throughput, 65 hashes per
line, one every 10 blocks received (Tom R.)
- Moved net-lwip/* to net/lwip/* (Simon G.)
- Rename static function low_level_output() to linkoutput() since it is
the name used in the lwIP netif struct.
- Fixed off-by-one in parse_url() which could cause wget to fail when
passed a URL with a host name (as opposed to a URL with an IP address).
- Improved TFTP performance by adding support for the blksize option
(patches "lwip: tftp: add support of blksize option to client" and
"net-lwip: add TFTP_BLOCKSIZE) (Tom R.)
- Add an optional port number to the tftp command for easier testing
(syntax: tftp [[ip:[port:]]filename])
- wget: display an "unsupported URI" error if uri is not http://
(Jon H.)
- Adjusted the lwIP TCP options in lib/lwip/u-boot/lwipopts.h for
better performance, in particular TCP_WND.
- Add "net: fec_mxc_init(): do not ignore return status of fec_open()"
- Set the proper environment variables when DHCP succeeds (ipaddr%d
etc.) and read the proper ones for the given device in new_netif(),
allowing correct behavior when several adapters are available (tested
on i.MX8M Plus).
- Fix an alignment issue with outgoing packets (see the linkoutput()
function). With that the i.MX8M Plus ENET1 interface works properly.
(reported by Tim H.).
- Add review tags

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.


Jerome Forissier (28):
  net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
  Make AVB_VERIFY depend on FASTBOOT
  linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  sandbox: add dummy driver ETH_SANDBOX_LWIP
  test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
  test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  net: introduce alternative implementation as net-lwip/
  configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y
  net: split include/net.h into net{,-common,-legacy,-lwip}.h
  net: move copy_filename() to new file net/net-common.c
  net: eth-uclass: add function eth_start_udev()
  net-lwip: build lwIP
  net-lwip: add DHCP support and dhcp commmand
  lwip: tftp: bind to TFTP port only when in server mode
  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
  lwip: tftp: add support of blksize option to client
  net-lwip: add TFTP_BLOCKSIZE
  CI: add qemu_arm64_lwip to the test matrix
  MAINTAINERS: net-lwip: add myself as a maintainer
  configs: use syntax CONFIG_FOO=n in tools-only_defconfig
  [TESTING] configs: set CONFIG_NET=y for FTGMAC100
  [TESTING] Kconfig: enable NET_LWIP by default

Jonathan Humphreys (1):
  net-lwip: lwIP wget supports user defined port in the uri, so allow
    it.

 .azure-pipelines.yml                          |   7 +
 Kconfig                                       |  29 +
 MAINTAINERS                                   |  11 +
 Makefile                                      |   6 +-
 arch/Kconfig                                  |   2 +-
 board/engicam/imx8mp/icore_mx8mp.c            |   2 +-
 .../imx8mp_debix_model_a.c                    |   2 +-
 board/ti/am335x/board.c                       |   3 +-
 board/xilinx/common/board.c                   |   3 +-
 boot/Kconfig                                  |   4 +-
 cmd/Kconfig                                   | 140 +--
 cmd/Makefile                                  |   9 +-
 cmd/bdinfo.c                                  |   5 +-
 cmd/elf.c                                     |   2 +-
 cmd/net-common.c                              | 109 ++
 cmd/net-lwip.c                                |  45 +
 cmd/net.c                                     | 115 ---
 common/Kconfig                                |   3 +-
 common/board_r.c                              |   4 +-
 common/spl/Kconfig                            |   1 +
 common/usb_kbd.c                              |   2 +-
 configs/LicheePi_Zero_defconfig               |   2 +-
 configs/M5249EVB_defconfig                    |   2 +-
 configs/am335x_pdu001_defconfig               |   2 +-
 configs/am62ax_evm_r5_defconfig               |   2 +-
 configs/am62px_evm_r5_defconfig               |   2 +-
 configs/am62x_beagleplay_r5_defconfig         |   2 +-
 configs/amcore_defconfig                      |   2 +-
 configs/amd_versal2_mini_defconfig            |   2 +-
 configs/amd_versal2_mini_emmc_defconfig       |   2 +-
 configs/amd_versal2_mini_ospi_defconfig       |   2 +-
 configs/amd_versal2_mini_qspi_defconfig       |   2 +-
 configs/anbernic-rgxx3-rk3566_defconfig       |   2 +-
 configs/ap143_defconfig                       |   2 +-
 configs/ap152_defconfig                       |   2 +-
 configs/apple_m1_defconfig                    |   2 +-
 configs/astro_mcf5373l_defconfig              |   2 +-
 configs/at91sam9rlek_dataflash_defconfig      |   2 +-
 configs/at91sam9rlek_mmc_defconfig            |   2 +-
 configs/at91sam9rlek_nandflash_defconfig      |   2 +-
 configs/bcm7260_defconfig                     |   2 +-
 configs/bcm7445_defconfig                     |   2 +-
 configs/bcm968380gerg_ram_defconfig           |   2 +-
 configs/bcmns_defconfig                       |   2 +-
 configs/chromebook_samus_tpl_defconfig        |   2 +-
 configs/cortina_presidio-asic-base_defconfig  |   2 +-
 configs/cortina_presidio-asic-pnand_defconfig |   2 +-
 configs/durian_defconfig                      |   2 +-
 configs/e850-96_defconfig                     |   2 +-
 configs/ea-lpc3250devkitv2_defconfig          |   2 +-
 configs/efi-x86_app32_defconfig               |   2 +-
 configs/efi-x86_app64_defconfig               |   2 +-
 configs/emsdp_defconfig                       |   2 +-
 configs/evb-ast2500_defconfig                 |   1 +
 configs/evb-ast2600_defconfig                 |   1 +
 configs/evb-px5_defconfig                     |   2 +-
 configs/generic-rk3568_defconfig              |   2 +-
 configs/generic-rk3588_defconfig              |   2 +-
 configs/hc2910_2aghd05_defconfig              |   2 +-
 configs/igep00x0_defconfig                    |   2 +-
 configs/imx6q_bosch_acc_defconfig             |   2 +-
 configs/imx6ulz_smm_m2_defconfig              |   2 +-
 configs/iot_devkit_defconfig                  |   2 +-
 configs/j722s_evm_r5_defconfig                |   2 +-
 configs/legoev3_defconfig                     |   2 +-
 configs/mk808_defconfig                       |   2 +-
 configs/mx23evk_defconfig                     |   2 +-
 configs/mx28evk_defconfig                     |   2 +-
 configs/mx6memcal_defconfig                   |   2 +-
 configs/mx6ulz_14x14_evk_defconfig            |   2 +-
 configs/mx7ulp_com_defconfig                  |   2 +-
 configs/mx7ulp_evk_defconfig                  |   2 +-
 configs/mx7ulp_evk_plugin_defconfig           |   2 +-
 configs/netgear_cg3100d_ram_defconfig         |   2 +-
 configs/nsim_700_defconfig                    |   2 +-
 configs/nsim_700be_defconfig                  |   2 +-
 configs/nsim_hs38be_defconfig                 |   2 +-
 configs/openpiton_riscv64_defconfig           |   2 +-
 configs/openpiton_riscv64_spl_defconfig       |   2 +-
 configs/origen_defconfig                      |   2 +-
 configs/pe2201_defconfig                      |   2 +-
 configs/pinecube_defconfig                    |   2 +-
 configs/pm9261_defconfig                      |   2 +-
 configs/qemu_arm64_lwip_defconfig             |   9 +
 configs/s5p4418_nanopi2_defconfig             |   2 +-
 configs/s5p_goni_defconfig                    |   2 +-
 configs/s5pc210_universal_defconfig           |   2 +-
 configs/sama5d27_giantboard_defconfig         |   2 +-
 configs/sama5d29_curiosity_mmc1_defconfig     |   2 +-
 configs/sama5d29_curiosity_mmc_defconfig      |   2 +-
 .../sama5d29_curiosity_qspiflash_defconfig    |   2 +-
 configs/sama7g54_curiosity_mmc_defconfig      |   2 +-
 .../sama7g54_curiosity_nandflash_defconfig    |   2 +-
 .../sama7g54_curiosity_qspiflash_defconfig    |   2 +-
 configs/sipeed_maix_bitm_defconfig            |   2 +-
 configs/sipeed_maix_smode_defconfig           |   2 +-
 configs/stemmy_defconfig                      |   2 +-
 configs/stm32f429-discovery_defconfig         |   2 +-
 configs/stm32f429-evaluation_defconfig        |   2 +-
 configs/stm32f469-discovery_defconfig         |   2 +-
 configs/stm32h743-disco_defconfig             |   2 +-
 configs/stm32h743-eval_defconfig              |   2 +-
 configs/stm32h750-art-pi_defconfig            |   2 +-
 configs/stm32mp25_defconfig                   |   2 +-
 configs/stmark2_defconfig                     |   2 +-
 configs/th1520_lpi4a_defconfig                |   2 +-
 configs/thunderx_88xx_defconfig               |   2 +-
 configs/tools-only_defconfig                  |  34 +-
 configs/topic_miami_defconfig                 |   2 +-
 configs/topic_miamilite_defconfig             |   2 +-
 configs/topic_miamiplus_defconfig             |   2 +-
 configs/total_compute_defconfig               |   2 +-
 configs/trats2_defconfig                      |   2 +-
 configs/trats_defconfig                       |   2 +-
 configs/xenguest_arm64_defconfig              |   2 +-
 configs/xenguest_arm64_virtio_defconfig       |   2 +-
 configs/xilinx_versal_mini_defconfig          |   2 +-
 configs/xilinx_versal_mini_emmc0_defconfig    |   2 +-
 configs/xilinx_versal_mini_emmc1_defconfig    |   2 +-
 configs/xilinx_versal_mini_ospi_defconfig     |   2 +-
 configs/xilinx_versal_mini_qspi_defconfig     |   2 +-
 configs/xilinx_versal_net_mini_defconfig      |   2 +-
 configs/xilinx_versal_net_mini_emmc_defconfig |   2 +-
 configs/xilinx_versal_net_mini_ospi_defconfig |   2 +-
 configs/xilinx_versal_net_mini_qspi_defconfig |   2 +-
 configs/xilinx_zynqmp_mini_defconfig          |   2 +-
 configs/xilinx_zynqmp_mini_emmc0_defconfig    |   2 +-
 configs/xilinx_zynqmp_mini_emmc1_defconfig    |   2 +-
 configs/xilinx_zynqmp_mini_nand_defconfig     |   2 +-
 .../xilinx_zynqmp_mini_nand_single_defconfig  |   2 +-
 configs/xilinx_zynqmp_mini_qspi_defconfig     |   2 +-
 configs/zynq_cse_nand_defconfig               |   2 +-
 configs/zynq_cse_nor_defconfig                |   2 +-
 configs/zynq_cse_qspi_defconfig               |   2 +-
 drivers/dfu/Kconfig                           |   1 +
 drivers/fastboot/Kconfig                      |   1 +
 drivers/net/Kconfig                           |  16 +-
 drivers/net/Makefile                          |   1 +
 drivers/net/eepro100.c                        |   2 +-
 drivers/net/phy/Kconfig                       |   2 +-
 drivers/net/rtl8139.c                         |   2 +-
 drivers/net/sandbox-lwip.c                    |  85 ++
 drivers/usb/gadget/Kconfig                    |   2 +-
 include/net-common.h                          | 509 ++++++++++
 include/net-legacy.h                          | 541 ++++++++++
 include/net-lwip.h                            |  41 +
 include/net.h                                 | 943 +-----------------
 lib/Makefile                                  |   2 +
 lib/binman.c                                  |   1 +
 lib/lwip/Makefile                             |  55 +
 lib/lwip/lwip/src/apps/tftp/tftp.c            | 104 +-
 .../lwip/src/include/lwip/apps/tftp_client.h  |   1 +
 lib/lwip/u-boot/arch/cc.h                     |  45 +
 lib/lwip/u-boot/arch/sys_arch.h               |   0
 lib/lwip/u-boot/limits.h                      |   0
 lib/lwip/u-boot/lwipopts.h                    | 157 +++
 lib/tiny-printf.c                             |   3 +-
 net/Kconfig                                   |  81 +-
 net/Makefile                                  |  20 +-
 net/eth-uclass.c                              |  38 +-
 net/lwip/Kconfig                              |  49 +
 net/lwip/Makefile                             |   8 +
 net/lwip/dhcp.c                               | 136 +++
 net/lwip/dns.c                                | 127 +++
 net/lwip/eth_internal.h                       |  35 +
 net/lwip/net-lwip.c                           | 307 ++++++
 net/lwip/ping.c                               | 177 ++++
 net/lwip/tftp.c                               | 290 ++++++
 net/lwip/wget.c                               | 357 +++++++
 net/net-common.c                              |  13 +
 net/net.c                                     |  12 -
 test/boot/bootdev.c                           |  11 +-
 test/boot/bootflow.c                          |   7 +-
 test/cmd/Makefile                             |   2 +
 test/dm/Makefile                              |   2 +
 175 files changed, 3607 insertions(+), 1346 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 drivers/net/sandbox-lwip.c
 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
 create mode 100644 net/net-common.c

-- 
2.40.1


^ permalink raw reply	[flat|nested] 76+ messages in thread

* [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-09  1:51   ` Simon Glass
  2024-10-03 15:22 ` [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT Jerome Forissier
                   ` (30 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Joe Hershberger,
	Ramon Fried, Tom Rini, Maxim Uvarov, Simon Glass

Note: patch posted separately [0].

[0] http://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/

Some drivers do not behave properly when free_pkt() is called with a
length of zero. It is an issue I observed when developing the lwIP
series [1] (see "QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139"
in the change log) and which I fixed incorrectly by not calling
free_pkt() when recv() returns 0. That turned out to be wrong for two
reasons:

1. The DM documentation [2] clearly requires it:

  "The **recv** function polls for availability of a new packet. [...]
   If there is an error [...], return 0 if you require the packet to
   be cleaned up normally, or a negative error code otherwise (cleanup
   not necessary or already done).

   If **free_pkt** is defined, U-Boot will call it after a received
   packet has been processed [...]. free_pkt() will be called after
   recv(), for the same packet [...]"

2. The imx8mp_evk platform will fail with OOM errors if free_pkt() is
   not called after recv() returns 0:

   u-boot=> tftp 192.168.0.16:50M
   Using ethernet@30be0000 device
   TFTP from server 192.168.0.16; our IP address is 192.168.0.48
   Filename '50M'.
   Load address: 0x40480000
   Loading: #######################fecmxc_recv: error allocating packetp
   fecmxc_recv: error allocating packetp
   fecmxc_recv: error allocating packetp
   ...

Therefore, make recv() return -EINVAL instead of 0 when no packet is
available and the driver doesn't expect free_pkt() to be called
subsequently.

[1] https://lists.denx.de/pipermail/u-boot/2024-August/562861.html
[2] doc/develop/driver-model/ethernet.rst

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 drivers/net/eepro100.c | 2 +-
 drivers/net/rtl8139.c  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
index d18a8d577ca..f64dbb7d6a1 100644
--- a/drivers/net/eepro100.c
+++ b/drivers/net/eepro100.c
@@ -678,7 +678,7 @@ static int eepro100_recv_common(struct eepro100_priv *priv, uchar **packetp)
 	status = le16_to_cpu(desc->status);
 
 	if (!(status & RFD_STATUS_C))
-		return 0;
+		return -EAGAIN;
 
 	/* Valid frame status. */
 	if (status & RFD_STATUS_OK) {
diff --git a/drivers/net/rtl8139.c b/drivers/net/rtl8139.c
index 2e0afad089f..5f4b1e2d3a0 100644
--- a/drivers/net/rtl8139.c
+++ b/drivers/net/rtl8139.c
@@ -433,7 +433,7 @@ static int rtl8139_recv_common(struct rtl8139_priv *priv, unsigned char *rxdata,
 	int length = 0;
 
 	if (inb(priv->ioaddr + RTL_REG_CHIPCMD) & RTL_REG_CHIPCMD_RXBUFEMPTY)
-		return 0;
+		return -EAGAIN;
 
 	priv->rxstatus = inw(priv->ioaddr + RTL_REG_INTRSTATUS);
 	/* See below for the rest of the interrupt acknowledges.  */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-09  1:51   ` Simon Glass
  2024-10-03 15:22 ` [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64 Jerome Forissier
                   ` (29 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Mattijs Korpershoek, Stefan Roese, Joshua Watt,
	Marek Vasut, Rasmus Villemoes, Jagan Teki

Note: Patch posted separately [0].

[0] http://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/

AVB_BUF_ADDR, which is under "if AVB_VERIFY", defaults to
FASTBOOT_BUF_ADDR. Therefore AVB_VERIFY should depend on FASTBOOT.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 common/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/common/Kconfig b/common/Kconfig
index 957de0c5c02..c011ab6e820 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -850,6 +850,7 @@ config AVB_VERIFY
 	depends on LIBAVB
 	depends on MMC
 	depends on PARTITION_UUIDS
+	depends on FASTBOOT
 	help
 	  This option enables compilation of bootloader-dependent operations,
 	  used by Android Verified Boot 2.0 library (libavb). Includes:
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  7:12   ` Ilias Apalodimas
  2024-10-04 12:04   ` Heinrich Schuchardt
  2024-10-03 15:22 ` [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP Jerome Forissier
                   ` (28 subsequent siblings)
  31 siblings, 2 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Jiaxun Yang, Heinrich Schuchardt, Dan Carpenter,
	Alexander Gendin

Note: Patch posted separately [0].

[0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/

CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
exception may occur. Fixes an issue found on malta64 with QEMU:

 Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
 31                      if (!strcmp(name, entry->name))
 [...]
 ld      a1,0(s0)

 (gdb) p/x &entry->name
 0xffffffffbe04b0d4
 (gdb) p/x $s0
 0xffffffffbe04b0d4

 $ grep __u_boot_list /tmp/malta64/u-boot.objdump
 4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 arch/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 8f1f4667012..8f4df849801 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
 config LINKER_LIST_ALIGN
 	int
 	default 32 if SANDBOX
-	default 8 if ARM64 || X86
+	default 8 if ARM64 || X86 || CPU_MIPS64
 	default 4
 	help
 	  Force the each linker list to be aligned to this boundary. This
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (2 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64 Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  7:13   ` Ilias Apalodimas
  2024-10-09  1:55   ` Simon Glass
  2024-10-03 15:22 ` [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled Jerome Forissier
                   ` (27 subsequent siblings)
  31 siblings, 2 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Yang Xiwen, Kever Yang,
	Philip Oberfichtner, Boon Khai Ng, Robert Marko, Jonas Karlman,
	Neil Armstrong, Patrice Chotard, Marek Vasut

Introduce ETH_SANDBOX_LWIP which enables a mock driver similar to
ETH_SANDOX but without the dependencies on the legacy network stack
(NET) so that it may be enabled when the lwIP stack (NET_LWIP) is
introduced. The driver does nothing at this stage but its presence
will allow dm_test_iommu_noiommu [1] to pass.

[1] ./u-boot -T -c "ut dm dm_test_iommu_noiommu"

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 drivers/net/Kconfig        | 11 +++++
 drivers/net/Makefile       |  1 +
 drivers/net/sandbox-lwip.c | 85 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 97 insertions(+)
 create mode 100644 drivers/net/sandbox-lwip.c

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index e7d0ddfe25a..2f39ec05ac7 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -350,6 +350,17 @@ config ETH_SANDBOX
 
 	  This driver is particularly useful in the test/dm/eth.c tests
 
+config ETH_SANDBOX_LWIP
+	depends on SANDBOX
+	depends on NET_LWIP
+	default y
+	bool "Sandbox: Mocked Ethernet driver (for NET_LWIP)"
+	help
+	  This driver is meant as a replacement for ETH_SANDBOX when
+	  the network stack is NET_LWIP rather than NET. It currently
+	  does nothing, i.e. it drops the sent packets and never receives
+	  data.
+
 config ETH_SANDBOX_RAW
 	depends on SANDBOX
 	default y
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 4946a63f80f..f5ab1f5dedf 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_ETH_DESIGNWARE_SOCFPGA) += dwmac_socfpga.o
 obj-$(CONFIG_ETH_SANDBOX) += sandbox.o
 obj-$(CONFIG_ETH_SANDBOX_RAW) += sandbox-raw-bus.o
 obj-$(CONFIG_ETH_SANDBOX_RAW) += sandbox-raw.o
+obj-$(CONFIG_ETH_SANDBOX_LWIP) += sandbox-lwip.o
 obj-$(CONFIG_FEC_MXC) += fec_mxc.o
 obj-$(CONFIG_FMAN_ENET) += fm/
 obj-$(CONFIG_FMAN_ENET) += fsl_mdio.o
diff --git a/drivers/net/sandbox-lwip.c b/drivers/net/sandbox-lwip.c
new file mode 100644
index 00000000000..3721033c310
--- /dev/null
+++ b/drivers/net/sandbox-lwip.c
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2015 National Instruments
+ *
+ * (C) Copyright 2015
+ * Joe Hershberger <joe.hershberger@ni.com>
+ */
+
+#include <dm.h>
+#include <log.h>
+#include <malloc.h>
+#include <net.h>
+#include <asm/eth.h>
+#include <asm/global_data.h>
+#include <asm/test.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int sb_lwip_eth_start(struct udevice *dev)
+{
+	debug("eth_sandbox_lwip: Start\n");
+
+	return 0;
+}
+
+static int sb_lwip_eth_send(struct udevice *dev, void *packet, int length)
+{
+	debug("eth_sandbox_lwip: Send packet %d\n", length);
+
+	return -ENOTSUPP;
+}
+
+static int sb_lwip_eth_recv(struct udevice *dev, int flags, uchar **packetp)
+{
+	return -EAGAIN;
+}
+
+static int sb_lwip_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
+{
+	return 0;
+}
+
+static void sb_lwip_eth_stop(struct udevice *dev)
+{
+}
+
+static int sb_lwip_eth_write_hwaddr(struct udevice *dev)
+{
+	return 0;
+}
+
+static const struct eth_ops sb_eth_ops = {
+	.start			= sb_lwip_eth_start,
+	.send			= sb_lwip_eth_send,
+	.recv			= sb_lwip_eth_recv,
+	.free_pkt		= sb_lwip_eth_free_pkt,
+	.stop			= sb_lwip_eth_stop,
+	.write_hwaddr		= sb_lwip_eth_write_hwaddr,
+};
+
+static int sb_lwip_eth_remove(struct udevice *dev)
+{
+	return 0;
+}
+
+static int sb_lwip_eth_of_to_plat(struct udevice *dev)
+{
+	return 0;
+}
+
+static const struct udevice_id sb_eth_ids[] = {
+	{ .compatible = "sandbox,eth" },
+	{ }
+};
+
+U_BOOT_DRIVER(eth_sandbox) = {
+	.name	= "eth_lwip_sandbox",
+	.id	= UCLASS_ETH,
+	.of_match = sb_eth_ids,
+	.of_to_plat = sb_lwip_eth_of_to_plat,
+	.remove	= sb_lwip_eth_remove,
+	.ops	= &sb_eth_ops,
+	.priv_auto	= 0,
+	.plat_auto	= sizeof(struct eth_pdata),
+};
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (3 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-09  1:51   ` Simon Glass
  2024-10-03 15:22 ` [PATCH v11 06/29] test: boot: fix bootflow_cmd_label " Jerome Forissier
                   ` (26 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Simon Glass,
	Tom Rini, Marek Vasut, Mattijs Korpershoek

When DSA_SANDBOX is not set, the sandbox tests fail as follows:

 $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
 [...]
 Test: bootdev_test_any: bootdev.c
 test/boot/bootdev.c:156, bootdev_test_any(): "mmc2" = media->name: Expected "mmc2", got "mmc0"
 [...]

This is due to the device list containing two less entries than
expected. Therefore, adjust the expected index to be two less when
DSA_SANDBOX is disabled.

The actual use case is NET_LWIP=y (to be introduced in later patches)
which implies DSA_SANDBOX=n for the time being.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 test/boot/bootdev.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/test/boot/bootdev.c b/test/boot/bootdev.c
index c635d06ec25..369105ca4cf 100644
--- a/test/boot/bootdev.c
+++ b/test/boot/bootdev.c
@@ -128,6 +128,7 @@ BOOTSTD_TEST(bootdev_test_labels, UTF_DM | UTF_SCAN_FDT | UTF_ETH_BOOTDEV);
 static int bootdev_test_any(struct unit_test_state *uts)
 {
 	struct udevice *dev, *media;
+	char *seq;
 	int mflags;
 
 	/*
@@ -147,8 +148,16 @@ static int bootdev_test_any(struct unit_test_state *uts)
 	 * 8   [   ]      OK  mmc       mmc2.bootdev
 	 * 9   [ + ]      OK  mmc       mmc1.bootdev
 	 * a   [   ]      OK  mmc       mmc0.bootdev
+	 *
+	 * However if DSA_SANDBOX is disabled the dsa-test@{0,1} devices
+	 * are not there.
 	 */
-	ut_assertok(bootdev_find_by_any("8", &dev, &mflags));
+	if (CONFIG_IS_ENABLED(DSA_SANDBOX))
+		seq = "8";
+	else
+		seq = "6";
+
+	ut_assertok(bootdev_find_by_any(seq, &dev, &mflags));
 	ut_asserteq(UCLASS_BOOTDEV, device_get_uclass_id(dev));
 	ut_asserteq(BOOTFLOW_METHF_SINGLE_DEV, mflags);
 	media = dev_get_parent(dev);
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (4 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  6:55   ` Ilias Apalodimas
  2024-10-03 15:22 ` [PATCH v11 07/29] net: introduce alternative implementation as net-lwip/ Jerome Forissier
                   ` (25 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Simon Glass,
	Tom Rini, Mattijs Korpershoek, AKASHI Takahiro,
	Heinrich Schuchardt, Francis Laniel

When DSA_SANDBOX is not set, the sandbox tests fail as follows:

 $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
 [...]
 Scanning for bootflows with label '9'
 [...]
 Cannot find '9' (err=-19)

This is due to the device list containing two less entries than
expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.

The actual use case is NET_LWIP=y (to be introduced in later patches)
which implies DSA_SANDBOX=n for the time being.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 test/boot/bootflow.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index 6ad63afe90a..c440b8eb778 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
 	 * 8   [   ]      OK  mmc       mmc2.bootdev
 	 * 9   [ + ]      OK  mmc       mmc1.bootdev
 	 * a   [   ]      OK  mmc       mmc0.bootdev
+	 *
+	 * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
+	 * dsa-test@1).
 	 */
-	ut_assertok(run_command("bootflow scan -lH 9", 0));
-	ut_assert_nextline("Scanning for bootflows with label '9'");
+	ut_assertok(run_command("bootflow scan -lH 7", 0));
+	ut_assert_nextline("Scanning for bootflows with label '7'");
 	ut_assert_skip_to_line("(1 bootflow, 1 valid)");
 
 	ut_assertok(run_command("bootflow scan -lH 0", 0));
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 07/29] net: introduce alternative implementation as net-lwip/
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (5 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 06/29] test: boot: fix bootflow_cmd_label " Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 08/29] configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y Jerome Forissier
                   ` (24 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Lukasz Majewski, Mattijs Korpershoek, Joe Hershberger,
	Ramon Fried, Marek Vasut, Simon Glass, Paul Kocialkowski,
	Hiago De Franco, Sean Anderson, Jonas Karlman, John Keeping,
	Greg Malysa, Heinrich Schuchardt, Sumit Garg, Andrew Davis,
	Rasmus Villemoes, Bryan Brattlof, Leon M. Busch-George,
	AKASHI Takahiro, Eddie James, Quentin Schulz, Stefan Roese,
	Joshua Watt, Jiaxun Yang, Andre Przywara, Samuel Holland,
	Lukas Funke, Jaehoon Chung, Alexey Romanov, Ion Agorria,
	Svyatoslav Ryhel, Yang Xiwen, Robert Marko, Peter Robinson,
	Neil Armstrong, Boon Khai Ng, Miquel Raynal, Baruch Siach,
	Anand Moon, Alexander Gendin, Johan Jonker

Prepare the introduction of the lwIP (lightweight IP) TCP/IP stack by
adding a new net/lwip/ directory and the NET_LWIP symbol. Network
support is either NO_NET, NET (legacy stack) or NET_LWIP. Subsequent
commits will introduce the lwIP code, re-work the NETDEVICE integration
and port some of the NET commands and features to lwIP.

SPL_NET cannot be enabled when NET_LWIP=y. SPL_NET pulls some symbols
that are part of NET (such as arp_init(), arp_timeout_check(),
arp_receive(), net_arp_wait_packet_ip()). lwIP support in SPL may be
added later.

Similarly, DFU_TFTP and FASTBOOT are not compatible with NET_LWIP
because of dependencies on net_loop(), tftp_timeout_ms,
tftp_timeout_count_max and other NET things. Let's add a dependency on
!NET_LWIP for now.

SANDBOX can select NET_LWIP but doing so will currently disable the eth
dm tests as well as the wget tests which have strong dependencies on the
NET code.

Other adjustments to Kconfig files are made to fix "unmet direct
dependencies detected" for USB_FUNCTION_SDP and CMD_FASTBOOT when
the default networking stack is set to NET_LWIP ("default NET_LWIP"
instead of "default NET" in Kconfig).

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 Kconfig                    | 29 ++++++++++++++++++
 Makefile                   |  2 +-
 boot/Kconfig               |  4 ++-
 cmd/Kconfig                |  1 +
 common/Kconfig             |  2 +-
 common/spl/Kconfig         |  1 +
 drivers/dfu/Kconfig        |  1 +
 drivers/fastboot/Kconfig   |  1 +
 drivers/net/Kconfig        |  3 ++
 drivers/net/phy/Kconfig    |  2 +-
 drivers/usb/gadget/Kconfig |  2 +-
 net/Kconfig                | 61 +++++++++++++++++++-------------------
 net/Makefile               |  4 +++
 net/lwip/Kconfig           | 49 ++++++++++++++++++++++++++++++
 test/cmd/Makefile          |  2 ++
 test/dm/Makefile           |  2 ++
 16 files changed, 131 insertions(+), 35 deletions(-)
 create mode 100644 net/lwip/Kconfig

diff --git a/Kconfig b/Kconfig
index ab46b27999c..9e3a55798f9 100644
--- a/Kconfig
+++ b/Kconfig
@@ -752,8 +752,37 @@ source "dts/Kconfig"
 
 source "env/Kconfig"
 
+menu Networking
+
+choice
+	prompt "Networking stack"
+	default NET
+
+config NO_NET
+	bool "No networking support"
+
+config NET
+	bool "Legacy U-Boot networking stack"
+	imply NETDEVICES
+
+config NET_LWIP
+	bool "Use lwIP for networking stack"
+	imply NETDEVICES
+	help
+	  Include networking support based on the lwIP (lightweight IP)
+	  TCP/IP stack (https://nongnu.org/lwip). This is a replacement for
+	  the default U-Boot network stack and applications located in net/
+	  and enabled via CONFIG_NET as well as other pieces of code that
+	  depend on CONFIG_NET (such as cmd/net.c enabled via CONFIG_CMD_NET).
+	  Therefore the two symbols CONFIG_NET and CONFIG_NET_LWIP are mutually
+	  exclusive.
+
+endchoice
+
 source "net/Kconfig"
 
+endmenu
+
 source "drivers/Kconfig"
 
 source "fs/Kconfig"
diff --git a/Makefile b/Makefile
index 8711831767d..96211738b2f 100644
--- a/Makefile
+++ b/Makefile
@@ -859,7 +859,7 @@ libs-$(CONFIG_OF_EMBED) += dts/
 libs-y += env/
 libs-y += lib/
 libs-y += fs/
-libs-y += net/
+libs-$(filter y,$(CONFIG_NET) $(CONFIG_NET_LWIP)) += net/
 libs-y += disk/
 libs-y += drivers/
 libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
diff --git a/boot/Kconfig b/boot/Kconfig
index 925afe06a19..1d50a83a2d2 100644
--- a/boot/Kconfig
+++ b/boot/Kconfig
@@ -503,7 +503,8 @@ config BOOTMETH_ANDROID
 	select ANDROID_AB
 	select ANDROID_BOOT_IMAGE
 	select CMD_BCB
-	select CMD_FASTBOOT
+	imply CMD_FASTBOOT
+	imply FASTBOOT if !NET_LWIP
 	select PARTITION_TYPE_GUID
 	select PARTITION_UUIDS
 	help
@@ -559,6 +560,7 @@ config BOOTMETH_EXTLINUX_PXE
 config BOOTMETH_EFILOADER
 	bool "Bootdev support for EFI boot"
 	depends on EFI_BINARY_EXEC
+	imply CMD_TFTPBOOT if CMD_NET
 	default y
 	help
 	  Enables support for EFI boot using bootdevs. This makes the
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 5ef3c8a8748..3beddd72583 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1661,6 +1661,7 @@ config CMD_USB
 
 config CMD_USB_SDP
 	bool "sdp"
+	depends on USB_GADGET_DOWNLOAD
 	select USB_FUNCTION_SDP
 	help
 	  Enables the command "sdp" which is used to have U-Boot emulating the
diff --git a/common/Kconfig b/common/Kconfig
index c011ab6e820..90cee19d413 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -424,7 +424,7 @@ config LOGF_FUNC_PAD
 
 config LOG_SYSLOG
 	bool "Log output to syslog server"
-	depends on NET
+	depends on NET || NET_LWIP
 	help
 	  Enables a log driver which broadcasts log records via UDP port 514
 	  to syslog servers.
diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 137f94a1681..97bafa50c9e 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -1073,6 +1073,7 @@ config SPL_DM_SPI_FLASH
 
 config SPL_NET
 	bool "Support networking"
+	depends on !NET_LWIP
 	help
 	  Enable support for network devices (such as Ethernet) in SPL.
 	  This permits SPL to load U-Boot over a network link rather than
diff --git a/drivers/dfu/Kconfig b/drivers/dfu/Kconfig
index aadd7e8cf7f..604386bb734 100644
--- a/drivers/dfu/Kconfig
+++ b/drivers/dfu/Kconfig
@@ -20,6 +20,7 @@ config DFU_WRITE_ALT
 config DFU_TFTP
 	bool "DFU via TFTP"
 	depends on NETDEVICES
+	depends on !NET_LWIP
 	select UPDATE_COMMON
 	select DFU_OVER_TFTP
 	help
diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
index 70207573de2..1eb460f5a02 100644
--- a/drivers/fastboot/Kconfig
+++ b/drivers/fastboot/Kconfig
@@ -1,5 +1,6 @@
 menu "Fastboot support"
 	depends on CMDLINE
+	depends on !NET_LWIP
 
 config FASTBOOT
 	bool
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 2f39ec05ac7..9c042808b44 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -48,6 +48,7 @@ config DM_DSA
 	bool "Enable Driver Model for DSA switches"
 	depends on DM_MDIO
 	depends on PHY_FIXED
+	depends on !NET_LWIP
 	help
 	  Enable driver model for DSA switches
 
@@ -342,6 +343,7 @@ config ESSEDMA
 
 config ETH_SANDBOX
 	depends on SANDBOX
+	depends on NET
 	default y
 	bool "Sandbox: Mocked Ethernet driver"
 	help
@@ -363,6 +365,7 @@ config ETH_SANDBOX_LWIP
 
 config ETH_SANDBOX_RAW
 	depends on SANDBOX
+	depends on NET
 	default y
 	bool "Sandbox: Bridge to Linux Raw Sockets"
 	help
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index a9efc509814..13e73810ad6 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -11,7 +11,7 @@ config MV88E6352_SWITCH
 
 menuconfig PHYLIB
 	bool "Ethernet PHY (physical media interface) support"
-	depends on NET
+	depends on NET || NET_LWIP
 	help
 	  Enable Ethernet PHY (physical media interface) support.
 
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index f20a16e3e7d..96ed3a2def0 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -224,7 +224,7 @@ endif # USB_GADGET_DOWNLOAD
 
 config USB_ETHER
 	bool "USB Ethernet Gadget"
-	depends on NET
+	depends on NET || NET_LWIP
 	default y if ARCH_SUNXI && USB_MUSB_GADGET
 	help
 	  Creates an Ethernet network device through a USB peripheral
diff --git a/net/Kconfig b/net/Kconfig
index 7cb80b880a9..16a9de47e94 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -2,11 +2,6 @@
 # Network configuration
 #
 
-menuconfig NET
-	bool "Networking support"
-	default y
-	imply NETDEVICES
-
 if NET
 
 config ARP_TIMEOUT
@@ -26,15 +21,6 @@ config PROT_UDP
 	  Enable a generic udp framework that allows defining a custom
 	  handler for udp protocol.
 
-config BOOTDEV_ETH
-	bool "Enable bootdev for ethernet"
-	depends on BOOTSTD
-	default y
-	help
-	  Provide a bootdev for ethernet so that is it possible to boot
-	  an operationg system over the network, using the PXE (Preboot
-	  Execution Environment) protocol.
-
 config BOOTP_SEND_HOSTNAME
 	bool "Send hostname to DNS server"
 	help
@@ -45,15 +31,6 @@ config BOOTP_SEND_HOSTNAME
 	  of the "hostname" environment variable is passed as
 	  option 12 to the DHCP server.
 
-config NET_RANDOM_ETHADDR
-	bool "Random ethaddr if unset"
-	help
-	  Selecting this will allow the Ethernet interface to function even
-	  when the ethaddr variable for that interface is unset.  In this case,
-	  a random MAC address in the locally administered address space is
-	  generated. It will be saved to the appropriate environment variable,
-	  too.
-
 config NETCONSOLE
 	bool "NetConsole support"
 	help
@@ -255,11 +232,35 @@ config IPV6
 
 endif   # if NET
 
+source "net/lwip/Kconfig"
+
+if NET || NET_LWIP
+
+config BOOTDEV_ETH
+	bool "Enable bootdev for ethernet"
+	depends on BOOTSTD
+	default y
+	help
+	  Provide a bootdev for ethernet so that is it possible to boot
+	  an operating system over the network, using the PXE (Preboot
+	  Execution Environment) protocol.
+
+config NET_RANDOM_ETHADDR
+	bool "Random ethaddr if unset"
+	help
+	  Selecting this will allow the Ethernet interface to function even
+	  when the ethaddr variable for that interface is unset.  In this case,
+	  a random MAC address in the locally administered address space is
+	  generated. It will be saved to the appropriate environment variable,
+	  too.
+
+endif   # if NET || NET_LWIP
+
 config SYS_RX_ETH_BUFFER
-	int "Number of receive packet buffers"
-	default 4
-	help
-	  Defines the number of Ethernet receive buffers. On some Ethernet
-	  controllers it is recommended to set this value to 8 or even higher,
-	  since all buffers can be full shortly after enabling the interface on
-	  high Ethernet traffic.
+        int "Number of receive packet buffers"
+        default 4
+        help
+          Defines the number of Ethernet receive buffers. On some Ethernet
+          controllers it is recommended to set this value to 8 or even higher,
+          since all buffers can be full shortly after enabling the interface on
+          high Ethernet traffic.
diff --git a/net/Makefile b/net/Makefile
index 64ab7ec740a..70eec8caf0d 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -5,6 +5,8 @@
 
 #ccflags-y += -DDEBUG
 
+ifeq ($(CONFIG_NET),y)
+
 obj-$(CONFIG_NET)      += arp.o
 obj-$(CONFIG_CMD_BOOTP) += bootp.o
 obj-$(CONFIG_CMD_CDP)  += cdp.o
@@ -38,3 +40,5 @@ obj-$(CONFIG_CMD_WGET) += wget.o
 # sprintf(buf, index ? "foo%d" : "foo", index)
 # and this is intentional usage.
 CFLAGS_eth_common.o += -Wno-format-extra-args
+
+endif
diff --git a/net/lwip/Kconfig b/net/lwip/Kconfig
new file mode 100644
index 00000000000..8a67de4cf33
--- /dev/null
+++ b/net/lwip/Kconfig
@@ -0,0 +1,49 @@
+#
+# Network configuration (with lwIP stack)
+#
+
+if NET_LWIP
+
+config LWIP_DEBUG
+	bool "Enable debug traces in the lwIP library"
+
+config LWIP_ASSERT
+	bool "Enable assertions in the lwIP library"
+
+config PROT_DHCP_LWIP
+	bool
+	select PROT_UDP_LWIP
+
+config PROT_DNS_LWIP
+	bool
+	select PROT_UDP_LWIP
+
+config PROT_RAW_LWIP
+	bool
+
+config PROT_TCP_LWIP
+	bool
+
+config PROT_TCP_SACK_LWIP
+	bool "TCP SACK support"
+	depends on PROT_TCP_LWIP
+	default y
+	help
+	  TCP protocol with selective acknowledgements. Improves
+	  file transfer speed in wget.
+
+config PROT_UDP_LWIP
+	bool
+
+config LWIP_TCP_WND
+	int "Value of TCP_WND"
+	default 8000 if ARCH_QEMU
+	default 3000000
+	help
+	  Default value for TCP_WND in the lwIP configuration
+	  Lower values result in slower wget transfer speeds in
+	  general, especially when the latency on the network is high,
+	  but QEMU with "-net user" needs no more than a few KB or the
+	  transfer will stall and eventually time out.
+
+endif # NET_LWIP
diff --git a/test/cmd/Makefile b/test/cmd/Makefile
index 8f2134998ad..dbee9b26405 100644
--- a/test/cmd/Makefile
+++ b/test/cmd/Makefile
@@ -30,7 +30,9 @@ ifdef CONFIG_SANDBOX
 obj-$(CONFIG_CMD_MBR) += mbr.o
 obj-$(CONFIG_CMD_READ) += rw.o
 obj-$(CONFIG_CMD_SETEXPR) += setexpr.o
+ifdef CONFIG_NET
 obj-$(CONFIG_CMD_WGET) += wget.o
+endif
 obj-$(CONFIG_ARM_FFA_TRANSPORT) += armffa.o
 endif
 obj-$(CONFIG_CMD_TEMPERATURE) += temperature.o
diff --git a/test/dm/Makefile b/test/dm/Makefile
index c12589d487c..03952441278 100644
--- a/test/dm/Makefile
+++ b/test/dm/Makefile
@@ -48,7 +48,9 @@ obj-$(CONFIG_VIDEO_MIPI_DSI) += dsi_host.o
 obj-$(CONFIG_DM_DSA) += dsa.o
 obj-$(CONFIG_ECDSA_VERIFY) += ecdsa.o
 obj-$(CONFIG_EFI_MEDIA_SANDBOX) += efi_media.o
+ifdef CONFIG_NET
 obj-$(CONFIG_DM_ETH) += eth.o
+endif
 obj-$(CONFIG_EXTCON) += extcon.o
 ifneq ($(CONFIG_EFI_PARTITION),)
 obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fastboot.o
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 08/29] configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (6 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 07/29] net: introduce alternative implementation as net-lwip/ Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-03 15:22 ` [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h Jerome Forissier
                   ` (23 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Felix Brack,
	Icenowy Zheng, Tom Rini, Angelo Dureghello, Vignesh Raghavendra,
	Bryan Brattlof, Nishanth Menon, Robert Nelson, Michal Simek,
	Chris Morgan, Wills Wang, Rosy Song, Mark Kettenis,
	Wolfgang Wegner, Stelian Pop, Thomas Fitzsimmons, Philippe Reynes,
	Linus Walleij, Simon Glass, Alex Nemirovsky, liuhao, shuyiqi,
	Sam Protsenko, Trevor Woerner, Heinrich Schuchardt,
	Alexey Brodkin, Andy Yan, Jonas Karlman, Yang Xiwen,
	Enric Balletbo i Serra, Matthias Winker, Philip Oberfichtner,
	Michael Trimarchi, Vaishnav Achath, Jayesh Choudhary,
	David Lechner, Johan Jonker, Fabio Estevam, Otavio Salvador,
	Eric Nelson, Peng Fan, Álvaro Fernández Rojas,
	Tianrui Wei, Minkyu Kang, lixinde, weichangzheng, Ilko Iliev,
	Stefan Bosch, Jaehoon Chung, Greg Gallagher, Mihai Sain,
	Sean Anderson, Stephan Gerhold, Kamil Lulko, Patrick Delaunay,
	Patrice Chotard, Dillon Min, Wei Fu, Yixun Lan,
	Sergey Temerkhanov, Mike Looijmans, Usama Arif,
	Anastasiia Lukianenko, Oleksandr Andrushchenko, Paul Kocialkowski,
	Martyn Welch, Quentin Schulz, Marcel Ziswiler, Svyatoslav Ryhel,
	Andrew Davis, Wadim Egorov, Venkatesh Yadav Abbarapu, Kever Yang,
	Dragan Simic, Janne Grunau, Neal Gompa, Sughosh Ganu,
	Hector Martin, Sumit Garg, Javier Martinez Canillas,
	Patrick Barsanti, Francesco Dolcini, Marek Vasut, Heiko Schocher,
	TracyMg_Li, Dario Binacchi, Andrii Chepurnyi

The parent patch has made the networking stack a choice between NO_NET,
NET and NET_LWIP. Therefore '# CONFIG_NET is not set' is now
'CONFIG_NO_NET=y'. Adjust the defconfigs accordingly. Note that this
patch is intended to be folded in but is kept separate separate for now
to make review easier.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Tested-by: Felix Brack <fb@ltec.ch>
---
 configs/LicheePi_Zero_defconfig                  | 2 +-
 configs/M5249EVB_defconfig                       | 2 +-
 configs/am335x_pdu001_defconfig                  | 2 +-
 configs/am62ax_evm_r5_defconfig                  | 2 +-
 configs/am62px_evm_r5_defconfig                  | 2 +-
 configs/am62x_beagleplay_r5_defconfig            | 2 +-
 configs/amcore_defconfig                         | 2 +-
 configs/amd_versal2_mini_defconfig               | 2 +-
 configs/amd_versal2_mini_emmc_defconfig          | 2 +-
 configs/amd_versal2_mini_ospi_defconfig          | 2 +-
 configs/amd_versal2_mini_qspi_defconfig          | 2 +-
 configs/anbernic-rgxx3-rk3566_defconfig          | 2 +-
 configs/ap143_defconfig                          | 2 +-
 configs/ap152_defconfig                          | 2 +-
 configs/apple_m1_defconfig                       | 2 +-
 configs/astro_mcf5373l_defconfig                 | 2 +-
 configs/at91sam9rlek_dataflash_defconfig         | 2 +-
 configs/at91sam9rlek_mmc_defconfig               | 2 +-
 configs/at91sam9rlek_nandflash_defconfig         | 2 +-
 configs/bcm7260_defconfig                        | 2 +-
 configs/bcm7445_defconfig                        | 2 +-
 configs/bcm968380gerg_ram_defconfig              | 2 +-
 configs/bcmns_defconfig                          | 2 +-
 configs/chromebook_samus_tpl_defconfig           | 2 +-
 configs/cortina_presidio-asic-base_defconfig     | 2 +-
 configs/cortina_presidio-asic-pnand_defconfig    | 2 +-
 configs/durian_defconfig                         | 2 +-
 configs/e850-96_defconfig                        | 2 +-
 configs/ea-lpc3250devkitv2_defconfig             | 2 +-
 configs/efi-x86_app32_defconfig                  | 2 +-
 configs/efi-x86_app64_defconfig                  | 2 +-
 configs/emsdp_defconfig                          | 2 +-
 configs/evb-px5_defconfig                        | 2 +-
 configs/generic-rk3568_defconfig                 | 2 +-
 configs/generic-rk3588_defconfig                 | 2 +-
 configs/hc2910_2aghd05_defconfig                 | 2 +-
 configs/igep00x0_defconfig                       | 2 +-
 configs/imx6q_bosch_acc_defconfig                | 2 +-
 configs/imx6ulz_smm_m2_defconfig                 | 2 +-
 configs/iot_devkit_defconfig                     | 2 +-
 configs/j722s_evm_r5_defconfig                   | 2 +-
 configs/legoev3_defconfig                        | 2 +-
 configs/mk808_defconfig                          | 2 +-
 configs/mx23evk_defconfig                        | 2 +-
 configs/mx28evk_defconfig                        | 2 +-
 configs/mx6memcal_defconfig                      | 2 +-
 configs/mx6ulz_14x14_evk_defconfig               | 2 +-
 configs/mx7ulp_com_defconfig                     | 2 +-
 configs/mx7ulp_evk_defconfig                     | 2 +-
 configs/mx7ulp_evk_plugin_defconfig              | 2 +-
 configs/netgear_cg3100d_ram_defconfig            | 2 +-
 configs/nsim_700_defconfig                       | 2 +-
 configs/nsim_700be_defconfig                     | 2 +-
 configs/nsim_hs38be_defconfig                    | 2 +-
 configs/openpiton_riscv64_defconfig              | 2 +-
 configs/openpiton_riscv64_spl_defconfig          | 2 +-
 configs/origen_defconfig                         | 2 +-
 configs/pe2201_defconfig                         | 2 +-
 configs/pinecube_defconfig                       | 2 +-
 configs/pm9261_defconfig                         | 2 +-
 configs/s5p4418_nanopi2_defconfig                | 2 +-
 configs/s5p_goni_defconfig                       | 2 +-
 configs/s5pc210_universal_defconfig              | 2 +-
 configs/sama5d27_giantboard_defconfig            | 2 +-
 configs/sama5d29_curiosity_mmc1_defconfig        | 2 +-
 configs/sama5d29_curiosity_mmc_defconfig         | 2 +-
 configs/sama5d29_curiosity_qspiflash_defconfig   | 2 +-
 configs/sama7g54_curiosity_mmc_defconfig         | 2 +-
 configs/sama7g54_curiosity_nandflash_defconfig   | 2 +-
 configs/sama7g54_curiosity_qspiflash_defconfig   | 2 +-
 configs/sipeed_maix_bitm_defconfig               | 2 +-
 configs/sipeed_maix_smode_defconfig              | 2 +-
 configs/stemmy_defconfig                         | 2 +-
 configs/stm32f429-discovery_defconfig            | 2 +-
 configs/stm32f429-evaluation_defconfig           | 2 +-
 configs/stm32f469-discovery_defconfig            | 2 +-
 configs/stm32h743-disco_defconfig                | 2 +-
 configs/stm32h743-eval_defconfig                 | 2 +-
 configs/stm32h750-art-pi_defconfig               | 2 +-
 configs/stm32mp25_defconfig                      | 2 +-
 configs/stmark2_defconfig                        | 2 +-
 configs/th1520_lpi4a_defconfig                   | 2 +-
 configs/thunderx_88xx_defconfig                  | 2 +-
 configs/tools-only_defconfig                     | 2 +-
 configs/topic_miami_defconfig                    | 2 +-
 configs/topic_miamilite_defconfig                | 2 +-
 configs/topic_miamiplus_defconfig                | 2 +-
 configs/total_compute_defconfig                  | 2 +-
 configs/trats2_defconfig                         | 2 +-
 configs/trats_defconfig                          | 2 +-
 configs/xenguest_arm64_defconfig                 | 2 +-
 configs/xenguest_arm64_virtio_defconfig          | 2 +-
 configs/xilinx_versal_mini_defconfig             | 2 +-
 configs/xilinx_versal_mini_emmc0_defconfig       | 2 +-
 configs/xilinx_versal_mini_emmc1_defconfig       | 2 +-
 configs/xilinx_versal_mini_ospi_defconfig        | 2 +-
 configs/xilinx_versal_mini_qspi_defconfig        | 2 +-
 configs/xilinx_versal_net_mini_defconfig         | 2 +-
 configs/xilinx_versal_net_mini_emmc_defconfig    | 2 +-
 configs/xilinx_versal_net_mini_ospi_defconfig    | 2 +-
 configs/xilinx_versal_net_mini_qspi_defconfig    | 2 +-
 configs/xilinx_zynqmp_mini_defconfig             | 2 +-
 configs/xilinx_zynqmp_mini_emmc0_defconfig       | 2 +-
 configs/xilinx_zynqmp_mini_emmc1_defconfig       | 2 +-
 configs/xilinx_zynqmp_mini_nand_defconfig        | 2 +-
 configs/xilinx_zynqmp_mini_nand_single_defconfig | 2 +-
 configs/xilinx_zynqmp_mini_qspi_defconfig        | 2 +-
 configs/zynq_cse_nand_defconfig                  | 2 +-
 configs/zynq_cse_nor_defconfig                   | 2 +-
 configs/zynq_cse_qspi_defconfig                  | 2 +-
 110 files changed, 110 insertions(+), 110 deletions(-)

diff --git a/configs/LicheePi_Zero_defconfig b/configs/LicheePi_Zero_defconfig
index 009384eaf1b..c37c49ccbb1 100644
--- a/configs/LicheePi_Zero_defconfig
+++ b/configs/LicheePi_Zero_defconfig
@@ -5,4 +5,4 @@ CONFIG_SPL=y
 CONFIG_MACH_SUN8I_V3S=y
 CONFIG_DRAM_CLK=360
 # CONFIG_HAS_ARMV7_SECURE_BASE is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
diff --git a/configs/M5249EVB_defconfig b/configs/M5249EVB_defconfig
index eac85b9c2d5..ed1446d81cb 100644
--- a/configs/M5249EVB_defconfig
+++ b/configs/M5249EVB_defconfig
@@ -22,7 +22,7 @@ CONFIG_CMD_MX_CYCLIC=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_CACHE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_FLASH_CFI_DRIVER=y
diff --git a/configs/am335x_pdu001_defconfig b/configs/am335x_pdu001_defconfig
index d9acc81e9d3..a8e901b40f9 100644
--- a/configs/am335x_pdu001_defconfig
+++ b/configs/am335x_pdu001_defconfig
@@ -41,7 +41,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPL_OF_TRANSLATE=y
diff --git a/configs/am62ax_evm_r5_defconfig b/configs/am62ax_evm_r5_defconfig
index 092d0830623..6b926f47507 100644
--- a/configs/am62ax_evm_r5_defconfig
+++ b/configs/am62ax_evm_r5_defconfig
@@ -68,7 +68,7 @@ CONFIG_ENV_IS_NOWHERE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_PART=1
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_REGMAP=y
diff --git a/configs/am62px_evm_r5_defconfig b/configs/am62px_evm_r5_defconfig
index 4f7be44cfba..11a00dbfc04 100644
--- a/configs/am62px_evm_r5_defconfig
+++ b/configs/am62px_evm_r5_defconfig
@@ -72,7 +72,7 @@ CONFIG_ENV_IS_NOWHERE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_PART=1
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_DEVICE_REMOVE=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
diff --git a/configs/am62x_beagleplay_r5_defconfig b/configs/am62x_beagleplay_r5_defconfig
index ee4c43ff97f..e32ec42111c 100644
--- a/configs/am62x_beagleplay_r5_defconfig
+++ b/configs/am62x_beagleplay_r5_defconfig
@@ -69,7 +69,7 @@ CONFIG_SPL_OF_CONTROL=y
 CONFIG_SPL_MULTI_DTB_FIT=y
 CONFIG_SPL_MULTI_DTB_FIT_NO_COMPRESSION=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_REGMAP=y
diff --git a/configs/amcore_defconfig b/configs/amcore_defconfig
index f1f5201b30a..94c5379590d 100644
--- a/configs/amcore_defconfig
+++ b/configs/amcore_defconfig
@@ -33,7 +33,7 @@ CONFIG_CMD_DIAG=y
 CONFIG_ENV_IS_IN_FLASH=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="AMCORE"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_FLASH_CFI_DRIVER=y
diff --git a/configs/amd_versal2_mini_defconfig b/configs/amd_versal2_mini_defconfig
index 0dd2305bfb2..684205d25a3 100644
--- a/configs/amd_versal2_mini_defconfig
+++ b/configs/amd_versal2_mini_defconfig
@@ -62,7 +62,7 @@ CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/amd_versal2_mini_emmc_defconfig b/configs/amd_versal2_mini_emmc_defconfig
index 7ad44386a6d..8484f182b93 100644
--- a/configs/amd_versal2_mini_emmc_defconfig
+++ b/configs/amd_versal2_mini_emmc_defconfig
@@ -53,7 +53,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_MMC_HS200_SUPPORT=y
 CONFIG_MMC_SDHCI=y
diff --git a/configs/amd_versal2_mini_ospi_defconfig b/configs/amd_versal2_mini_ospi_defconfig
index 2242960392f..d064165d79b 100644
--- a/configs/amd_versal2_mini_ospi_defconfig
+++ b/configs/amd_versal2_mini_ospi_defconfig
@@ -56,7 +56,7 @@ CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/amd_versal2_mini_qspi_defconfig b/configs/amd_versal2_mini_qspi_defconfig
index 3360c1546a2..e48c26243b8 100644
--- a/configs/amd_versal2_mini_qspi_defconfig
+++ b/configs/amd_versal2_mini_qspi_defconfig
@@ -56,7 +56,7 @@ CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig
index a03509bf467..937c27a947e 100644
--- a/configs/anbernic-rgxx3-rk3566_defconfig
+++ b/configs/anbernic-rgxx3-rk3566_defconfig
@@ -41,7 +41,7 @@ CONFIG_OF_LIVE=y
 # CONFIG_OF_UPSTREAM is not set
 CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPL_REGMAP=y
 CONFIG_SPL_SYSCON=y
diff --git a/configs/ap143_defconfig b/configs/ap143_defconfig
index c22048c1b53..13842e6c0f8 100644
--- a/configs/ap143_defconfig
+++ b/configs/ap143_defconfig
@@ -46,7 +46,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-flash.0:256k(u-boot),64k(u-boot-env),6336k
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_SPI_MAX_HZ=25000000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MTD=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH_ATMEL=y
diff --git a/configs/ap152_defconfig b/configs/ap152_defconfig
index ec700a5b3f0..5cc0ad2e682 100644
--- a/configs/ap152_defconfig
+++ b/configs/ap152_defconfig
@@ -46,7 +46,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-flash.0:256k(u-boot),64k(u-boot-env),6336k
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_SPI_MAX_HZ=25000000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MTD=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_SPI_FLASH_BAR=y
diff --git a/configs/apple_m1_defconfig b/configs/apple_m1_defconfig
index dca6e0ca8ba..d491a5d03c5 100644
--- a/configs/apple_m1_defconfig
+++ b/configs/apple_m1_defconfig
@@ -11,7 +11,7 @@ CONFIG_SYS_PBSIZE=276
 CONFIG_DISPLAY_BOARDINFO_LATE=y
 CONFIG_BOARD_LATE_INIT=y
 CONFIG_CMD_SELECT_FONT=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SYS_64BIT_LBA=y
 CONFIG_APPLE_SPI_KEYB=y
 # CONFIG_MMC is not set
diff --git a/configs/astro_mcf5373l_defconfig b/configs/astro_mcf5373l_defconfig
index d1942c28971..8dd369d68a1 100644
--- a/configs/astro_mcf5373l_defconfig
+++ b/configs/astro_mcf5373l_defconfig
@@ -27,7 +27,7 @@ CONFIG_CMD_I2C=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_CMD_CACHE=y
 CONFIG_CMD_JFFS2=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_FPGA_ALTERA=y
 CONFIG_FPGA_CYCLON2=y
 CONFIG_FPGA_XILINX=y
diff --git a/configs/at91sam9rlek_dataflash_defconfig b/configs/at91sam9rlek_dataflash_defconfig
index 931af2b2fda..01ac2cc8d1e 100644
--- a/configs/at91sam9rlek_dataflash_defconfig
+++ b/configs/at91sam9rlek_dataflash_defconfig
@@ -41,7 +41,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_SPI_MAX_HZ=15000000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_GPIO=y
diff --git a/configs/at91sam9rlek_mmc_defconfig b/configs/at91sam9rlek_mmc_defconfig
index 70d431c1f52..93f7d762109 100644
--- a/configs/at91sam9rlek_mmc_defconfig
+++ b/configs/at91sam9rlek_mmc_defconfig
@@ -39,7 +39,7 @@ CONFIG_CMD_FAT=y
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_FAT=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_GPIO=y
diff --git a/configs/at91sam9rlek_nandflash_defconfig b/configs/at91sam9rlek_nandflash_defconfig
index 1277a357cd2..928ad9f4f70 100644
--- a/configs/at91sam9rlek_nandflash_defconfig
+++ b/configs/at91sam9rlek_nandflash_defconfig
@@ -40,7 +40,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_GPIO=y
diff --git a/configs/bcm7260_defconfig b/configs/bcm7260_defconfig
index 2bf3c0d7fbe..345e37bca7e 100644
--- a/configs/bcm7260_defconfig
+++ b/configs/bcm7260_defconfig
@@ -35,7 +35,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_BCMSTB=y
 CONFIG_MTD=y
diff --git a/configs/bcm7445_defconfig b/configs/bcm7445_defconfig
index 07e3b57ac33..eb6629ba57a 100644
--- a/configs/bcm7445_defconfig
+++ b/configs/bcm7445_defconfig
@@ -37,7 +37,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_BCMSTB=y
 CONFIG_MTD=y
diff --git a/configs/bcm968380gerg_ram_defconfig b/configs/bcm968380gerg_ram_defconfig
index 6c119eb42a6..053c459e05c 100644
--- a/configs/bcm968380gerg_ram_defconfig
+++ b/configs/bcm968380gerg_ram_defconfig
@@ -41,7 +41,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_CMD_NAND=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_BCM6345_GPIO=y
 CONFIG_LED=y
diff --git a/configs/bcmns_defconfig b/configs/bcmns_defconfig
index 365284e94c3..f2719821656 100644
--- a/configs/bcmns_defconfig
+++ b/configs/bcmns_defconfig
@@ -28,7 +28,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_OF_EMBED=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="NS"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_MTD=y
 CONFIG_DM_MTD=y
diff --git a/configs/chromebook_samus_tpl_defconfig b/configs/chromebook_samus_tpl_defconfig
index 1be57560f89..075e3f192a3 100644
--- a/configs/chromebook_samus_tpl_defconfig
+++ b/configs/chromebook_samus_tpl_defconfig
@@ -74,7 +74,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="bzImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
 # CONFIG_ACPIGEN is not set
diff --git a/configs/cortina_presidio-asic-base_defconfig b/configs/cortina_presidio-asic-base_defconfig
index eb5743da64d..78167d56d83 100644
--- a/configs/cortina_presidio-asic-base_defconfig
+++ b/configs/cortina_presidio-asic-base_defconfig
@@ -31,7 +31,7 @@ CONFIG_CMD_TIMER=y
 CONFIG_CMD_SMC=y
 CONFIG_OF_CONTROL=y
 CONFIG_OF_LIVE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CORTINA_GPIO=y
 # CONFIG_MMC is not set
 CONFIG_DM_SERIAL=y
diff --git a/configs/cortina_presidio-asic-pnand_defconfig b/configs/cortina_presidio-asic-pnand_defconfig
index c7367d4d91c..f1526227d65 100644
--- a/configs/cortina_presidio-asic-pnand_defconfig
+++ b/configs/cortina_presidio-asic-pnand_defconfig
@@ -32,7 +32,7 @@ CONFIG_CMD_TIMER=y
 CONFIG_CMD_SMC=y
 CONFIG_OF_CONTROL=y
 CONFIG_OF_LIVE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CORTINA_GPIO=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
diff --git a/configs/durian_defconfig b/configs/durian_defconfig
index f1d45ca3064..ae7a05edee1 100644
--- a/configs/durian_defconfig
+++ b/configs/durian_defconfig
@@ -28,7 +28,7 @@ CONFIG_SYS_PROMPT="durian#"
 CONFIG_CMD_PCI=y
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SCSI_AHCI=y
 CONFIG_AHCI_PCI=y
 # CONFIG_MMC is not set
diff --git a/configs/e850-96_defconfig b/configs/e850-96_defconfig
index e5d90996234..5797c6cb1f9 100644
--- a/configs/e850-96_defconfig
+++ b/configs/e850-96_defconfig
@@ -20,7 +20,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_PART=y
 CONFIG_CMD_TIME=y
 CONFIG_CMD_RNG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK_EXYNOS850=y
 CONFIG_MMC_DW=y
 CONFIG_SOC_SAMSUNG=y
diff --git a/configs/ea-lpc3250devkitv2_defconfig b/configs/ea-lpc3250devkitv2_defconfig
index af9fc5f2f5c..c3af7afced1 100644
--- a/configs/ea-lpc3250devkitv2_defconfig
+++ b/configs/ea-lpc3250devkitv2_defconfig
@@ -25,7 +25,7 @@ CONFIG_SYS_PROMPT="EA-LPC3250v2=> "
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
 CONFIG_OF_CONTROL=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_LPC32XX_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_LPC32XX=y
diff --git a/configs/efi-x86_app32_defconfig b/configs/efi-x86_app32_defconfig
index 53ec63461d5..c2856b4000f 100644
--- a/configs/efi-x86_app32_defconfig
+++ b/configs/efi-x86_app32_defconfig
@@ -35,7 +35,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="bzImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
 # CONFIG_GZIP is not set
diff --git a/configs/efi-x86_app64_defconfig b/configs/efi-x86_app64_defconfig
index 3d021483dd0..0b709cf4dad 100644
--- a/configs/efi-x86_app64_defconfig
+++ b/configs/efi-x86_app64_defconfig
@@ -38,7 +38,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="bzImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
 CONFIG_CONSOLE_SCROLL_LINES=5
diff --git a/configs/emsdp_defconfig b/configs/emsdp_defconfig
index 07bed2b5623..26efa794058 100644
--- a/configs/emsdp_defconfig
+++ b/configs/emsdp_defconfig
@@ -30,7 +30,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="app.bin"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MMC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_SNPS=y
diff --git a/configs/evb-px5_defconfig b/configs/evb-px5_defconfig
index ccd38831533..8efab0c2fc0 100644
--- a/configs/evb-px5_defconfig
+++ b/configs/evb-px5_defconfig
@@ -57,7 +57,7 @@ CONFIG_OF_SPL_REMOVE_PROPS="pinctrl-0 pinctrl-names interrupt-parent"
 CONFIG_TPL_OF_PLATDATA=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_TPL_DM=y
 CONFIG_REGMAP=y
 CONFIG_SPL_REGMAP=y
diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig
index 66a33afbbaf..383dad3087b 100644
--- a/configs/generic-rk3568_defconfig
+++ b/configs/generic-rk3568_defconfig
@@ -40,7 +40,7 @@ CONFIG_OF_LIVE=y
 # CONFIG_OF_UPSTREAM is not set
 CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPL_REGMAP=y
 CONFIG_SPL_SYSCON=y
diff --git a/configs/generic-rk3588_defconfig b/configs/generic-rk3588_defconfig
index 42bc2c9a765..3c81401968d 100644
--- a/configs/generic-rk3588_defconfig
+++ b/configs/generic-rk3588_defconfig
@@ -35,7 +35,7 @@ CONFIG_OF_LIVE=y
 # CONFIG_OF_UPSTREAM is not set
 CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_SPL_REGMAP=y
 CONFIG_SPL_SYSCON=y
diff --git a/configs/hc2910_2aghd05_defconfig b/configs/hc2910_2aghd05_defconfig
index e68b44478a9..4302436d2e6 100644
--- a/configs/hc2910_2aghd05_defconfig
+++ b/configs/hc2910_2aghd05_defconfig
@@ -36,7 +36,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_PARTITION_TYPE_GUID=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
 # CONFIG_INPUT is not set
diff --git a/configs/igep00x0_defconfig b/configs/igep00x0_defconfig
index f1d9bb34aba..51c825d3fbe 100644
--- a/configs/igep00x0_defconfig
+++ b/configs/igep00x0_defconfig
@@ -60,7 +60,7 @@ CONFIG_ENV_UBI_VOLUME="config"
 CONFIG_ENV_UBI_VOLUME_REDUND="config_r"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_DM_I2C=y
 CONFIG_I2C_SET_DEFAULT_BUS_NUM=y
diff --git a/configs/imx6q_bosch_acc_defconfig b/configs/imx6q_bosch_acc_defconfig
index dce1b64bf69..3fca5d5139d 100644
--- a/configs/imx6q_bosch_acc_defconfig
+++ b/configs/imx6q_bosch_acc_defconfig
@@ -81,7 +81,7 @@ CONFIG_SYS_MMC_ENV_PART=1
 CONFIG_ENV_WRITEABLE_LIST=y
 CONFIG_ENV_ACCESS_IGNORE_FORCE=y
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_BOOTCOUNT_LIMIT=y
 CONFIG_DM_BOOTCOUNT=y
diff --git a/configs/imx6ulz_smm_m2_defconfig b/configs/imx6ulz_smm_m2_defconfig
index 93ead4c373b..c2adff17abf 100644
--- a/configs/imx6ulz_smm_m2_defconfig
+++ b/configs/imx6ulz_smm_m2_defconfig
@@ -42,7 +42,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_NAND=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0x82000000
diff --git a/configs/iot_devkit_defconfig b/configs/iot_devkit_defconfig
index c4920052f82..3dda897f765 100644
--- a/configs/iot_devkit_defconfig
+++ b/configs/iot_devkit_defconfig
@@ -34,7 +34,7 @@ CONFIG_ENV_FAT_DEVICE_AND_PART="0:1"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="app.bin"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MMC=y
 CONFIG_MMC_DW=y
 CONFIG_MMC_DW_SNPS=y
diff --git a/configs/j722s_evm_r5_defconfig b/configs/j722s_evm_r5_defconfig
index e574be9e19d..fd3259f6afb 100644
--- a/configs/j722s_evm_r5_defconfig
+++ b/configs/j722s_evm_r5_defconfig
@@ -72,7 +72,7 @@ CONFIG_ENV_IS_NOWHERE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_PART=1
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_DEVICE_REMOVE=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
diff --git a/configs/legoev3_defconfig b/configs/legoev3_defconfig
index 34ef3493cac..60b7a84205c 100644
--- a/configs/legoev3_defconfig
+++ b/configs/legoev3_defconfig
@@ -44,7 +44,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_DAVINCI=y
diff --git a/configs/mk808_defconfig b/configs/mk808_defconfig
index 9a342d3a33a..36ab4b03401 100644
--- a/configs/mk808_defconfig
+++ b/configs/mk808_defconfig
@@ -68,7 +68,7 @@ CONFIG_OF_DTB_PROPS_REMOVE=y
 CONFIG_SPL_OF_PLATDATA=y
 CONFIG_TPL_OF_PLATDATA=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_TPL_DM=y
 CONFIG_REGMAP=y
 CONFIG_SPL_REGMAP=y
diff --git a/configs/mx23evk_defconfig b/configs/mx23evk_defconfig
index 7d0e7cc1e00..59ab64ec97a 100644
--- a/configs/mx23evk_defconfig
+++ b/configs/mx23evk_defconfig
@@ -41,7 +41,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_MXS_GPIO=y
 CONFIG_MMC_MXS=y
 CONFIG_PINCTRL=y
diff --git a/configs/mx28evk_defconfig b/configs/mx28evk_defconfig
index dddb57efd3e..1295ff80c7b 100644
--- a/configs/mx28evk_defconfig
+++ b/configs/mx28evk_defconfig
@@ -47,7 +47,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_MXS_GPIO=y
 CONFIG_MMC_MXS=y
diff --git a/configs/mx6memcal_defconfig b/configs/mx6memcal_defconfig
index 4c8a5960d38..5cc8236feb9 100644
--- a/configs/mx6memcal_defconfig
+++ b/configs/mx6memcal_defconfig
@@ -38,7 +38,7 @@ CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_CACHE=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 # CONFIG_MMC is not set
 CONFIG_FSL_USDHC=y
diff --git a/configs/mx6ulz_14x14_evk_defconfig b/configs/mx6ulz_14x14_evk_defconfig
index d57b47ef47a..2c13dd4dbc3 100644
--- a/configs/mx6ulz_14x14_evk_defconfig
+++ b/configs/mx6ulz_14x14_evk_defconfig
@@ -36,7 +36,7 @@ CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_DEV=1
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 CONFIG_DM_74X164=y
 CONFIG_DM_I2C=y
diff --git a/configs/mx7ulp_com_defconfig b/configs/mx7ulp_com_defconfig
index f8dcc0abef5..6ea84c053ca 100644
--- a/configs/mx7ulp_com_defconfig
+++ b/configs/mx7ulp_com_defconfig
@@ -33,7 +33,7 @@ CONFIG_CMD_FAT=y
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 CONFIG_IMX_RGPIO2P=y
 # CONFIG_MXC_GPIO is not set
diff --git a/configs/mx7ulp_evk_defconfig b/configs/mx7ulp_evk_defconfig
index 38e6b62df45..5aadb9e93f1 100644
--- a/configs/mx7ulp_evk_defconfig
+++ b/configs/mx7ulp_evk_defconfig
@@ -33,7 +33,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 CONFIG_IMX_RGPIO2P=y
 # CONFIG_MXC_GPIO is not set
diff --git a/configs/mx7ulp_evk_plugin_defconfig b/configs/mx7ulp_evk_plugin_defconfig
index d007d180969..2f45fac0a89 100644
--- a/configs/mx7ulp_evk_plugin_defconfig
+++ b/configs/mx7ulp_evk_plugin_defconfig
@@ -31,7 +31,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_BOUNCE_BUFFER=y
 CONFIG_IMX_RGPIO2P=y
 # CONFIG_MXC_GPIO is not set
diff --git a/configs/netgear_cg3100d_ram_defconfig b/configs/netgear_cg3100d_ram_defconfig
index 352b98fc0a5..377cc26f937 100644
--- a/configs/netgear_cg3100d_ram_defconfig
+++ b/configs/netgear_cg3100d_ram_defconfig
@@ -39,7 +39,7 @@ CONFIG_CMD_MEMINFO=y
 CONFIG_CMD_SPI=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_BCM6345_GPIO=y
 CONFIG_LED=y
diff --git a/configs/nsim_700_defconfig b/configs/nsim_700_defconfig
index be2539e8cd7..e8400c2dc30 100644
--- a/configs/nsim_700_defconfig
+++ b/configs/nsim_700_defconfig
@@ -25,7 +25,7 @@ CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_SERIAL=y
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
diff --git a/configs/nsim_700be_defconfig b/configs/nsim_700be_defconfig
index 1fcf36a28a5..9ce1a255227 100644
--- a/configs/nsim_700be_defconfig
+++ b/configs/nsim_700be_defconfig
@@ -26,7 +26,7 @@ CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_SERIAL=y
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
diff --git a/configs/nsim_hs38be_defconfig b/configs/nsim_hs38be_defconfig
index 9c26e4da7d2..80d0e54192d 100644
--- a/configs/nsim_hs38be_defconfig
+++ b/configs/nsim_hs38be_defconfig
@@ -27,7 +27,7 @@ CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_BOOTFILE=y
 CONFIG_BOOTFILE="uImage"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_SERIAL=y
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
diff --git a/configs/openpiton_riscv64_defconfig b/configs/openpiton_riscv64_defconfig
index cdb9e1c932e..9df92e5c318 100644
--- a/configs/openpiton_riscv64_defconfig
+++ b/configs/openpiton_riscv64_defconfig
@@ -61,7 +61,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 # CONFIG_DOS_PARTITION is not set
 CONFIG_OF_EMBED=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CPU=y
 CONFIG_MMC=y
 # CONFIG_MMC_WRITE is not set
diff --git a/configs/openpiton_riscv64_spl_defconfig b/configs/openpiton_riscv64_spl_defconfig
index a08040d878d..29304cc50fe 100644
--- a/configs/openpiton_riscv64_spl_defconfig
+++ b/configs/openpiton_riscv64_spl_defconfig
@@ -77,7 +77,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 # CONFIG_DOS_PARTITION is not set
 # CONFIG_SPL_PARTITION_UUIDS is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CPU=y
 CONFIG_MMC=y
 # CONFIG_MMC_WRITE is not set
diff --git a/configs/origen_defconfig b/configs/origen_defconfig
index dc9285d4e99..26702d77079 100644
--- a/configs/origen_defconfig
+++ b/configs/origen_defconfig
@@ -41,7 +41,7 @@ CONFIG_CMD_EXT4_WRITE=y
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DFU_MMC=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x2000000
 CONFIG_MMC_DW=y
diff --git a/configs/pe2201_defconfig b/configs/pe2201_defconfig
index 5d32cbf8bf1..91fe7ebf982 100644
--- a/configs/pe2201_defconfig
+++ b/configs/pe2201_defconfig
@@ -27,7 +27,7 @@ CONFIG_CMD_DM=y
 CONFIG_CMD_PCI=y
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SCSI_AHCI=y
 CONFIG_AHCI_PCI=y
 # CONFIG_MMC is not set
diff --git a/configs/pinecube_defconfig b/configs/pinecube_defconfig
index 7cc0a862949..7567a6aa739 100644
--- a/configs/pinecube_defconfig
+++ b/configs/pinecube_defconfig
@@ -9,7 +9,7 @@ CONFIG_DRAM_ODT_EN=y
 CONFIG_I2C0_ENABLE=y
 # CONFIG_HAS_ARMV7_SECURE_BASE is not set
 CONFIG_SPL_I2C=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_SYS_I2C_LEGACY=y
 CONFIG_SYS_I2C_MVTWSI=y
 CONFIG_SYS_I2C_SLAVE=0x7f
diff --git a/configs/pm9261_defconfig b/configs/pm9261_defconfig
index 9f4d434f3e2..026c6de3109 100644
--- a/configs/pm9261_defconfig
+++ b/configs/pm9261_defconfig
@@ -37,7 +37,7 @@ CONFIG_MTDPARTS_DEFAULT="mtdparts=physmap-flash.0:256k(u-boot)ro,64k(u-boot-env)
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_FLASH=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_GPIO=y
diff --git a/configs/s5p4418_nanopi2_defconfig b/configs/s5p4418_nanopi2_defconfig
index ee72778995b..0bee0008294 100644
--- a/configs/s5p4418_nanopi2_defconfig
+++ b/configs/s5p4418_nanopi2_defconfig
@@ -49,7 +49,7 @@ CONFIG_CMD_FAT=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_MMC_ENV_DEV=2
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_NEXELL=y
 CONFIG_MMC_DW=y
diff --git a/configs/s5p_goni_defconfig b/configs/s5p_goni_defconfig
index 4316510541c..084e19e1258 100644
--- a/configs/s5p_goni_defconfig
+++ b/configs/s5p_goni_defconfig
@@ -44,7 +44,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_MMC=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DFU_MMC=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x2000000
 CONFIG_DM_I2C_GPIO=y
diff --git a/configs/s5pc210_universal_defconfig b/configs/s5pc210_universal_defconfig
index 67959ad79cd..99e873ff427 100644
--- a/configs/s5pc210_universal_defconfig
+++ b/configs/s5pc210_universal_defconfig
@@ -41,7 +41,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DFU_MMC=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x2000000
 CONFIG_SYS_I2C_S3C24X0=y
diff --git a/configs/sama5d27_giantboard_defconfig b/configs/sama5d27_giantboard_defconfig
index 283c9300c56..34274ca4a32 100644
--- a/configs/sama5d27_giantboard_defconfig
+++ b/configs/sama5d27_giantboard_defconfig
@@ -64,7 +64,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_SPL_REMOVE_PROPS="interrupts interrupt-parent dmas dma-names"
 CONFIG_ENV_IS_IN_FAT=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_CLK=y
diff --git a/configs/sama5d29_curiosity_mmc1_defconfig b/configs/sama5d29_curiosity_mmc1_defconfig
index 61edb23b196..5d9173a0e57 100644
--- a/configs/sama5d29_curiosity_mmc1_defconfig
+++ b/configs/sama5d29_curiosity_mmc1_defconfig
@@ -70,7 +70,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA5D29"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_UTMI=y
diff --git a/configs/sama5d29_curiosity_mmc_defconfig b/configs/sama5d29_curiosity_mmc_defconfig
index 0b16f386735..2b765f56dda 100644
--- a/configs/sama5d29_curiosity_mmc_defconfig
+++ b/configs/sama5d29_curiosity_mmc_defconfig
@@ -69,7 +69,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA5D29"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_UTMI=y
diff --git a/configs/sama5d29_curiosity_qspiflash_defconfig b/configs/sama5d29_curiosity_qspiflash_defconfig
index 9b522e81ef5..d840d0f3d6f 100644
--- a/configs/sama5d29_curiosity_qspiflash_defconfig
+++ b/configs/sama5d29_curiosity_qspiflash_defconfig
@@ -69,7 +69,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA5D29"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_AT91=y
 CONFIG_AT91_UTMI=y
diff --git a/configs/sama7g54_curiosity_mmc_defconfig b/configs/sama7g54_curiosity_mmc_defconfig
index 00a091df0e5..ba8643c912c 100644
--- a/configs/sama7g54_curiosity_mmc_defconfig
+++ b/configs/sama7g54_curiosity_mmc_defconfig
@@ -74,7 +74,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA7G54"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_CCF=y
 CONFIG_CLK_AT91=y
diff --git a/configs/sama7g54_curiosity_nandflash_defconfig b/configs/sama7g54_curiosity_nandflash_defconfig
index 0b2116d0419..49b08d3fc2b 100644
--- a/configs/sama7g54_curiosity_nandflash_defconfig
+++ b/configs/sama7g54_curiosity_nandflash_defconfig
@@ -72,7 +72,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA7G54"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_CCF=y
 CONFIG_CLK_AT91=y
diff --git a/configs/sama7g54_curiosity_qspiflash_defconfig b/configs/sama7g54_curiosity_qspiflash_defconfig
index 00e5362a1fa..8fa5857e245 100644
--- a/configs/sama7g54_curiosity_qspiflash_defconfig
+++ b/configs/sama7g54_curiosity_qspiflash_defconfig
@@ -73,7 +73,7 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="SAMA7G54"
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 CONFIG_CLK_CCF=y
 CONFIG_CLK_AT91=y
diff --git a/configs/sipeed_maix_bitm_defconfig b/configs/sipeed_maix_bitm_defconfig
index 67d5a007a8e..8788eabf55a 100644
--- a/configs/sipeed_maix_bitm_defconfig
+++ b/configs/sipeed_maix_bitm_defconfig
@@ -17,7 +17,7 @@ CONFIG_BOARD_EARLY_INIT_F=y
 CONFIG_HUSH_PARSER=y
 CONFIG_MTDIDS_DEFAULT="nor0=spi3:0"
 CONFIG_MTDPARTS_DEFAULT="nor0:1M(u-boot),0x1000@0xfff000(env)"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK_K210_SET_RATE=y
 # CONFIG_INPUT is not set
 CONFIG_SF_DEFAULT_BUS=3
diff --git a/configs/sipeed_maix_smode_defconfig b/configs/sipeed_maix_smode_defconfig
index 049fac02cac..c8d8b1ac9e1 100644
--- a/configs/sipeed_maix_smode_defconfig
+++ b/configs/sipeed_maix_smode_defconfig
@@ -18,7 +18,7 @@ CONFIG_SYS_PBSIZE=276
 CONFIG_HUSH_PARSER=y
 CONFIG_MTDIDS_DEFAULT="nor0=spi3:0"
 CONFIG_MTDPARTS_DEFAULT="nor0:1M(u-boot),0x1000@0xfff000(env)"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_INPUT is not set
 CONFIG_SF_DEFAULT_BUS=3
 CONFIG_FS_EXT4=y
diff --git a/configs/stemmy_defconfig b/configs/stemmy_defconfig
index ee8e6be6e2c..efa3b477a6e 100644
--- a/configs/stemmy_defconfig
+++ b/configs/stemmy_defconfig
@@ -28,7 +28,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_PART=y
 CONFIG_CMD_GETTIME=y
 CONFIG_EFI_PARTITION=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_USB_FUNCTION_FASTBOOT=y
 CONFIG_FASTBOOT_BUF_ADDR=0x18100000
 CONFIG_FASTBOOT_FLASH=y
diff --git a/configs/stm32f429-discovery_defconfig b/configs/stm32f429-discovery_defconfig
index 5d59edb7381..21a466572bd 100644
--- a/configs/stm32f429-discovery_defconfig
+++ b/configs/stm32f429-discovery_defconfig
@@ -27,7 +27,7 @@ CONFIG_CMD_IMLS=y
 CONFIG_CMD_TIMER=y
 CONFIG_OF_CONTROL=y
 CONFIG_ENV_IS_IN_FLASH=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_MMC is not set
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
diff --git a/configs/stm32f429-evaluation_defconfig b/configs/stm32f429-evaluation_defconfig
index 3e220d73984..8f20d4ca3f5 100644
--- a/configs/stm32f429-evaluation_defconfig
+++ b/configs/stm32f429-evaluation_defconfig
@@ -25,7 +25,7 @@ CONFIG_CMD_TIMER=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_ARM_PL180_MMCI=y
 CONFIG_MTD=y
 CONFIG_MTD_NOR_FLASH=y
diff --git a/configs/stm32f469-discovery_defconfig b/configs/stm32f469-discovery_defconfig
index 9b5f38b9efa..33292bfaf0c 100644
--- a/configs/stm32f469-discovery_defconfig
+++ b/configs/stm32f469-discovery_defconfig
@@ -26,7 +26,7 @@ CONFIG_CMD_TIMER=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_ARM_PL180_MMCI=y
 CONFIG_MTD=y
 CONFIG_DM_MTD=y
diff --git a/configs/stm32h743-disco_defconfig b/configs/stm32h743-disco_defconfig
index 89d79e98b6f..f098b8dd6da 100644
--- a/configs/stm32h743-disco_defconfig
+++ b/configs/stm32h743-disco_defconfig
@@ -30,6 +30,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_STM32_SDMMC2=y
 # CONFIG_PINCTRL_FULL is not set
diff --git a/configs/stm32h743-eval_defconfig b/configs/stm32h743-eval_defconfig
index 6b4ebd11691..82823e8631f 100644
--- a/configs/stm32h743-eval_defconfig
+++ b/configs/stm32h743-eval_defconfig
@@ -30,6 +30,6 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_STM32_SDMMC2=y
 # CONFIG_PINCTRL_FULL is not set
diff --git a/configs/stm32h750-art-pi_defconfig b/configs/stm32h750-art-pi_defconfig
index 319b3033a40..df3ff43f4a9 100644
--- a/configs/stm32h750-art-pi_defconfig
+++ b/configs/stm32h750-art-pi_defconfig
@@ -36,7 +36,7 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_DMA=y
 CONFIG_STM32_SDMMC2=y
 # CONFIG_PINCTRL_FULL is not set
diff --git a/configs/stm32mp25_defconfig b/configs/stm32mp25_defconfig
index f5623a19bb2..9533e30db4d 100644
--- a/configs/stm32mp25_defconfig
+++ b/configs/stm32mp25_defconfig
@@ -31,7 +31,7 @@ CONFIG_CMD_TIMER=y
 CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_LOG=y
 CONFIG_OF_LIVE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_GPIO_HOG=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_STM32F7=y
diff --git a/configs/stmark2_defconfig b/configs/stmark2_defconfig
index f43a24c5b5e..79b21acd032 100644
--- a/configs/stmark2_defconfig
+++ b/configs/stmark2_defconfig
@@ -39,7 +39,7 @@ CONFIG_ENV_SPI_CS=1
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_USE_HOSTNAME=y
 CONFIG_HOSTNAME="stmark2"
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_FSL=y
 CONFIG_MTD=y
diff --git a/configs/th1520_lpi4a_defconfig b/configs/th1520_lpi4a_defconfig
index db80e33870b..9ab228256b0 100644
--- a/configs/th1520_lpi4a_defconfig
+++ b/configs/th1520_lpi4a_defconfig
@@ -58,7 +58,7 @@ CONFIG_CMD_BOOTMENU=y
 CONFIG_PARTITION_TYPE_GUID=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_VERSION_VARIABLE=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_BLOCK_CACHE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/thunderx_88xx_defconfig b/configs/thunderx_88xx_defconfig
index b754cc01cc8..107ad279e1b 100644
--- a/configs/thunderx_88xx_defconfig
+++ b/configs/thunderx_88xx_defconfig
@@ -32,7 +32,7 @@ CONFIG_SYS_PROMPT="ThunderX_88XX> "
 # CONFIG_CMD_SAVEENV is not set
 # CONFIG_CMD_ENV_EXISTS is not set
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_MMC is not set
 CONFIG_DM_SERIAL=y
 CONFIG_DEBUG_UART_SKIP_INIT=y
diff --git a/configs/tools-only_defconfig b/configs/tools-only_defconfig
index b54d2cefa10..e00f2c48598 100644
--- a/configs/tools-only_defconfig
+++ b/configs/tools-only_defconfig
@@ -22,7 +22,7 @@ CONFIG_BOOTCOMMAND="run distro_bootcmd"
 # CONFIG_CMD_DATE is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_ACPIGEN is not set
 CONFIG_AXI=y
 CONFIG_AXI_SANDBOX=y
diff --git a/configs/topic_miami_defconfig b/configs/topic_miami_defconfig
index 638d7306146..74b03d19ffb 100644
--- a/configs/topic_miami_defconfig
+++ b/configs/topic_miami_defconfig
@@ -52,7 +52,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DFU_RAM=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x600000
diff --git a/configs/topic_miamilite_defconfig b/configs/topic_miamilite_defconfig
index af47fab83c0..46071399a4d 100644
--- a/configs/topic_miamilite_defconfig
+++ b/configs/topic_miamilite_defconfig
@@ -52,7 +52,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DFU_RAM=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x600000
diff --git a/configs/topic_miamiplus_defconfig b/configs/topic_miamiplus_defconfig
index ad321749694..5562c738c5e 100644
--- a/configs/topic_miamiplus_defconfig
+++ b/configs/topic_miamiplus_defconfig
@@ -52,7 +52,7 @@ CONFIG_CMD_CACHE=y
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
 CONFIG_DFU_RAM=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x600000
diff --git a/configs/total_compute_defconfig b/configs/total_compute_defconfig
index 5f21d2e367a..b3d2e5c88a6 100644
--- a/configs/total_compute_defconfig
+++ b/configs/total_compute_defconfig
@@ -43,7 +43,7 @@ CONFIG_CMD_AVB=y
 CONFIG_CMD_UBI=y
 # CONFIG_ISO_PARTITION is not set
 CONFIG_OF_CONTROL=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_CLK=y
 # CONFIG_MMC_WRITE is not set
 CONFIG_ARM_PL180_MMCI=y
diff --git a/configs/trats2_defconfig b/configs/trats2_defconfig
index 67561368128..acfc42842e3 100644
--- a/configs/trats2_defconfig
+++ b/configs/trats2_defconfig
@@ -43,7 +43,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DFU_MMC=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x2000000
 CONFIG_DM_I2C_GPIO=y
diff --git a/configs/trats_defconfig b/configs/trats_defconfig
index 98925243bf4..070ab268474 100644
--- a/configs/trats_defconfig
+++ b/configs/trats_defconfig
@@ -42,7 +42,7 @@ CONFIG_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 CONFIG_DFU_MMC=y
 CONFIG_SYS_DFU_DATA_BUF_SIZE=0x2000000
 CONFIG_DM_I2C_GPIO=y
diff --git a/configs/xenguest_arm64_defconfig b/configs/xenguest_arm64_defconfig
index 6d040c2c15c..91657e0cd8b 100644
--- a/configs/xenguest_arm64_defconfig
+++ b/configs/xenguest_arm64_defconfig
@@ -37,7 +37,7 @@ CONFIG_CMD_PVBLOCK=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_MMC is not set
 # CONFIG_REQUIRE_SERIAL_CONSOLE is not set
 CONFIG_DM_SERIAL=y
diff --git a/configs/xenguest_arm64_virtio_defconfig b/configs/xenguest_arm64_virtio_defconfig
index d00a1ba0143..217b45a2c5e 100644
--- a/configs/xenguest_arm64_virtio_defconfig
+++ b/configs/xenguest_arm64_virtio_defconfig
@@ -42,7 +42,7 @@ CONFIG_CMD_PCI=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_PARTITION_TYPE_GUID=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_MMC is not set
 CONFIG_DM_PCI_COMPAT=y
 CONFIG_PCI_REGION_MULTI_ENTRY=y
diff --git a/configs/xilinx_versal_mini_defconfig b/configs/xilinx_versal_mini_defconfig
index b97bf5e60a9..e9183bc8071 100644
--- a/configs/xilinx_versal_mini_defconfig
+++ b/configs/xilinx_versal_mini_defconfig
@@ -57,7 +57,7 @@ CONFIG_SYS_ALT_MEMTEST=y
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_CMD_SLEEP is not set
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_MMC is not set
 CONFIG_ARM_DCC=y
diff --git a/configs/xilinx_versal_mini_emmc0_defconfig b/configs/xilinx_versal_mini_emmc0_defconfig
index 5c949e34442..7ba7e65597a 100644
--- a/configs/xilinx_versal_mini_emmc0_defconfig
+++ b/configs/xilinx_versal_mini_emmc0_defconfig
@@ -55,7 +55,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ZYNQ=y
diff --git a/configs/xilinx_versal_mini_emmc1_defconfig b/configs/xilinx_versal_mini_emmc1_defconfig
index 04cba5bc72d..54cc51ee7f3 100644
--- a/configs/xilinx_versal_mini_emmc1_defconfig
+++ b/configs/xilinx_versal_mini_emmc1_defconfig
@@ -55,7 +55,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_MMC_SDHCI=y
 CONFIG_MMC_SDHCI_ZYNQ=y
diff --git a/configs/xilinx_versal_mini_ospi_defconfig b/configs/xilinx_versal_mini_ospi_defconfig
index 8f162597603..5ffb2cd5bfb 100644
--- a/configs/xilinx_versal_mini_ospi_defconfig
+++ b/configs/xilinx_versal_mini_ospi_defconfig
@@ -51,7 +51,7 @@ CONFIG_SYS_PROMPT="Versal> "
 # CONFIG_CMD_ITEST is not set
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_MMC is not set
 CONFIG_MTD=y
diff --git a/configs/xilinx_versal_mini_qspi_defconfig b/configs/xilinx_versal_mini_qspi_defconfig
index 8fbde1c7d3c..552cbdd740b 100644
--- a/configs/xilinx_versal_mini_qspi_defconfig
+++ b/configs/xilinx_versal_mini_qspi_defconfig
@@ -53,7 +53,7 @@ CONFIG_SYS_PROMPT="Versal> "
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/xilinx_versal_net_mini_defconfig b/configs/xilinx_versal_net_mini_defconfig
index d6ebd080463..c4b1a5d5416 100644
--- a/configs/xilinx_versal_net_mini_defconfig
+++ b/configs/xilinx_versal_net_mini_defconfig
@@ -61,7 +61,7 @@ CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/xilinx_versal_net_mini_emmc_defconfig b/configs/xilinx_versal_net_mini_emmc_defconfig
index fc88eee10af..c64ab92533b 100644
--- a/configs/xilinx_versal_net_mini_emmc_defconfig
+++ b/configs/xilinx_versal_net_mini_emmc_defconfig
@@ -50,7 +50,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_MMC_HS200_SUPPORT=y
 CONFIG_MMC_SDHCI=y
diff --git a/configs/xilinx_versal_net_mini_ospi_defconfig b/configs/xilinx_versal_net_mini_ospi_defconfig
index 872a4a55952..f1a136fe52c 100644
--- a/configs/xilinx_versal_net_mini_ospi_defconfig
+++ b/configs/xilinx_versal_net_mini_ospi_defconfig
@@ -50,7 +50,7 @@ CONFIG_SYS_PROMPT="Versal NET> "
 # CONFIG_CMD_ITEST is not set
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_MMC is not set
 CONFIG_MTD=y
diff --git a/configs/xilinx_versal_net_mini_qspi_defconfig b/configs/xilinx_versal_net_mini_qspi_defconfig
index 00319e06102..75589c478d8 100644
--- a/configs/xilinx_versal_net_mini_qspi_defconfig
+++ b/configs/xilinx_versal_net_mini_qspi_defconfig
@@ -52,7 +52,7 @@ CONFIG_SYS_PROMPT="Versal NET> "
 # CONFIG_CMD_SOURCE is not set
 # CONFIG_CMD_SETEXPR is not set
 # CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_GPIO is not set
 # CONFIG_I2C is not set
diff --git a/configs/xilinx_zynqmp_mini_defconfig b/configs/xilinx_zynqmp_mini_defconfig
index 4b45074efc4..09d73b0617f 100644
--- a/configs/xilinx_zynqmp_mini_defconfig
+++ b/configs/xilinx_zynqmp_mini_defconfig
@@ -53,7 +53,7 @@ CONFIG_CMD_CACHE=y
 # CONFIG_CMD_SLEEP is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_DM_MAILBOX is not set
 # CONFIG_MMC is not set
diff --git a/configs/xilinx_zynqmp_mini_emmc0_defconfig b/configs/xilinx_zynqmp_mini_emmc0_defconfig
index 49c7235fb8c..0e0242d8aac 100644
--- a/configs/xilinx_zynqmp_mini_emmc0_defconfig
+++ b/configs/xilinx_zynqmp_mini_emmc0_defconfig
@@ -64,7 +64,7 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_DM_MAILBOX is not set
diff --git a/configs/xilinx_zynqmp_mini_emmc1_defconfig b/configs/xilinx_zynqmp_mini_emmc1_defconfig
index 1ef89f50444..01297f615b8 100644
--- a/configs/xilinx_zynqmp_mini_emmc1_defconfig
+++ b/configs/xilinx_zynqmp_mini_emmc1_defconfig
@@ -64,7 +64,7 @@ CONFIG_CMD_FS_GENERIC=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_DM_MAILBOX is not set
diff --git a/configs/xilinx_zynqmp_mini_nand_defconfig b/configs/xilinx_zynqmp_mini_nand_defconfig
index b4719536be1..fd27f565b03 100644
--- a/configs/xilinx_zynqmp_mini_nand_defconfig
+++ b/configs/xilinx_zynqmp_mini_nand_defconfig
@@ -48,7 +48,7 @@ CONFIG_CLOCKS=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_DM_MAILBOX is not set
 # CONFIG_MMC is not set
diff --git a/configs/xilinx_zynqmp_mini_nand_single_defconfig b/configs/xilinx_zynqmp_mini_nand_single_defconfig
index 7ede17654dd..480c00ed152 100644
--- a/configs/xilinx_zynqmp_mini_nand_single_defconfig
+++ b/configs/xilinx_zynqmp_mini_nand_single_defconfig
@@ -48,7 +48,7 @@ CONFIG_CLOCKS=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 # CONFIG_DM_MAILBOX is not set
 # CONFIG_MMC is not set
diff --git a/configs/xilinx_zynqmp_mini_qspi_defconfig b/configs/xilinx_zynqmp_mini_qspi_defconfig
index 0d79ecece71..d8830a6f247 100644
--- a/configs/xilinx_zynqmp_mini_qspi_defconfig
+++ b/configs/xilinx_zynqmp_mini_qspi_defconfig
@@ -67,7 +67,7 @@ CONFIG_SPL_SYS_MALLOC_SIZE=0x1000000
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_EMBED=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_FIRMWARE is not set
diff --git a/configs/zynq_cse_nand_defconfig b/configs/zynq_cse_nand_defconfig
index 750ea0db2b2..e7414c78d1e 100644
--- a/configs/zynq_cse_nand_defconfig
+++ b/configs/zynq_cse_nand_defconfig
@@ -69,7 +69,7 @@ CONFIG_SYS_MAXARGS=32
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_MMC is not set
diff --git a/configs/zynq_cse_nor_defconfig b/configs/zynq_cse_nor_defconfig
index 3155fe0b378..4f2186b2a51 100644
--- a/configs/zynq_cse_nor_defconfig
+++ b/configs/zynq_cse_nor_defconfig
@@ -69,7 +69,7 @@ CONFIG_SYS_MAXARGS=32
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_MMC is not set
diff --git a/configs/zynq_cse_qspi_defconfig b/configs/zynq_cse_qspi_defconfig
index f2e1aa6d3ab..a372a13fe2d 100644
--- a/configs/zynq_cse_qspi_defconfig
+++ b/configs/zynq_cse_qspi_defconfig
@@ -78,7 +78,7 @@ CONFIG_SYS_MAXARGS=32
 CONFIG_OF_EMBED=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
-# CONFIG_NET is not set
+CONFIG_NO_NET=y
 # CONFIG_DM_DEVICE_REMOVE is not set
 CONFIG_SPL_DM_SEQ_ALIAS=y
 # CONFIG_MMC is not set
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (7 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 08/29] configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  6:00   ` Ilias Apalodimas
  2024-10-03 15:22 ` [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c Jerome Forissier
                   ` (22 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Heinrich Schuchardt,
	Rasmus Villemoes, Andrew Davis, Sumit Garg, Bryan Brattlof,
	Leon M. Busch-George, Masahisa Kojima, Sean Anderson, Marek Vasut

Make net.h a wrapper which includes net-common.h and either
net-legacy.h or net-lwip.h based on NET_LWIP.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 Makefile             |   4 +-
 include/net-common.h | 501 +++++++++++++++++++++++
 include/net-legacy.h | 544 +++++++++++++++++++++++++
 include/net-lwip.h   |  14 +
 include/net.h        | 943 +------------------------------------------
 5 files changed, 1066 insertions(+), 940 deletions(-)
 create mode 100644 include/net-common.h
 create mode 100644 include/net-legacy.h
 create mode 100644 include/net-lwip.h

diff --git a/Makefile b/Makefile
index 96211738b2f..0910d8692d7 100644
--- a/Makefile
+++ b/Makefile
@@ -836,7 +836,9 @@ UBOOTINCLUDE    := \
 			-I$(srctree)/arch/arm/thumb1/include)) \
 	-I$(srctree)/arch/$(ARCH)/include \
 	-include $(srctree)/include/linux/kconfig.h \
-	-I$(srctree)/dts/upstream/include
+	-I$(srctree)/dts/upstream/include \
+	$(if $(CONFIG_NET_LWIP), -I$(srctree)/lib/lwip/lwip/src/include \
+		-I$(srctree)/lib/lwip/u-boot)
 
 NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
 
diff --git a/include/net-common.h b/include/net-common.h
new file mode 100644
index 00000000000..543f528a4a4
--- /dev/null
+++ b/include/net-common.h
@@ -0,0 +1,501 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __NET_COMMON_H__
+#define __NET_COMMON_H__
+
+#include <asm/cache.h>
+#include <command.h>
+#include <env.h>
+#include <hexdump.h>
+#include <linux/if_ether.h>
+#include <linux/types.h>
+#include <rand.h>
+#include <time.h>
+
+#define DEBUG_NET_PKT_TRACE 0	/* Trace all packet data */
+
+/*
+ *	The number of receive packet buffers, and the required packet buffer
+ *	alignment in memory.
+ *
+ */
+#define PKTBUFSRX	CONFIG_SYS_RX_ETH_BUFFER
+#define PKTALIGN	ARCH_DMA_MINALIGN
+
+/* IPv4 addresses are always 32 bits in size */
+struct in_addr {
+	__be32 s_addr;
+};
+
+#define PROT_IP		0x0800		/* IP protocol			*/
+#define PROT_ARP	0x0806		/* IP ARP protocol		*/
+#define PROT_WOL	0x0842		/* ether-wake WoL protocol	*/
+#define PROT_RARP	0x8035		/* IP ARP protocol		*/
+#define PROT_VLAN	0x8100		/* IEEE 802.1q protocol		*/
+#define PROT_IPV6	0x86dd		/* IPv6 over bluebook		*/
+#define PROT_PPP_SES	0x8864		/* PPPoE session messages	*/
+#define PROT_NCSI	0x88f8		/* NC-SI control packets        */
+
+#define IPPROTO_ICMP	 1	/* Internet Control Message Protocol	*/
+#define IPPROTO_TCP	6	/* Transmission Control Protocol	*/
+#define IPPROTO_UDP	17	/* User Datagram Protocol		*/
+
+#define IP_OFFS		0x1fff /* ip offset *= 8 */
+#define IP_FLAGS	0xe000 /* first 3 bits */
+#define IP_FLAGS_RES	0x8000 /* reserved */
+#define IP_FLAGS_DFRAG	0x4000 /* don't fragments */
+#define IP_FLAGS_MFRAG	0x2000 /* more fragments */
+
+#define IP_HDR_SIZE		(sizeof(struct ip_hdr))
+
+#define IP_MIN_FRAG_DATAGRAM_SIZE	(IP_HDR_SIZE + 8)
+
+/*
+ *	Internet Protocol (IP) + UDP header.
+ */
+struct ip_udp_hdr {
+	u8		ip_hl_v;	/* header length and version	*/
+	u8		ip_tos;		/* type of service		*/
+	u16		ip_len;		/* total length			*/
+	u16		ip_id;		/* identification		*/
+	u16		ip_off;		/* fragment offset field	*/
+	u8		ip_ttl;		/* time to live			*/
+	u8		ip_p;		/* protocol			*/
+	u16		ip_sum;		/* checksum			*/
+	struct in_addr	ip_src;		/* Source IP address		*/
+	struct in_addr	ip_dst;		/* Destination IP address	*/
+	u16		udp_src;	/* UDP source port		*/
+	u16		udp_dst;	/* UDP destination port		*/
+	u16		udp_len;	/* Length of UDP packet		*/
+	u16		udp_xsum;	/* Checksum			*/
+} __attribute__((packed));
+
+#define IP_UDP_HDR_SIZE		(sizeof(struct ip_udp_hdr))
+#define UDP_HDR_SIZE		(IP_UDP_HDR_SIZE - IP_HDR_SIZE)
+
+/* Number of packets processed together */
+#define ETH_PACKETS_BATCH_RECV	32
+
+/* ARP hardware address length */
+#define ARP_HLEN 6
+/*
+ * The size of a MAC address in string form, each digit requires two chars
+ * and five separator characters to form '00:00:00:00:00:00'.
+ */
+#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
+
+#define ARP_HDR_SIZE	(8+20)		/* Size assuming ethernet	*/
+
+#   define ARP_ETHER	    1		/* Ethernet  hardware address	*/
+
+/*
+ * Maximum packet size; used to allocate packet storage. Use
+ * the maxium Ethernet frame size as specified by the Ethernet
+ * standard including the 802.1Q tag (VLAN tagging).
+ * maximum packet size =  1522
+ * maximum packet size and multiple of 32 bytes =  1536
+ */
+#define PKTSIZE			1522
+#ifndef CONFIG_DM_DSA
+#define PKTSIZE_ALIGN		1536
+#else
+/* Maximum DSA tagging overhead (headroom and/or tailroom) */
+#define DSA_MAX_OVR		256
+#define PKTSIZE_ALIGN		(1536 + DSA_MAX_OVR)
+#endif
+
+/*
+ * Maximum receive ring size; that is, the number of packets
+ * we can buffer before overflow happens. Basically, this just
+ * needs to be enough to prevent a packet being discarded while
+ * we are processing the previous one.
+ * Used only in drivers/net/mvgbe.c.
+ */
+#define RINGSZ		4
+#define RINGSZ_LOG2	2
+
+extern int		net_restart_wrap;	/* Tried all network devices */
+extern uchar               *net_rx_packets[PKTBUFSRX]; /* Receive packets */
+extern const u8		net_bcast_ethaddr[ARP_HLEN];	/* Ethernet broadcast address */
+extern char	net_boot_file_name[1024];/* Boot File name */
+
+/**
+ * compute_ip_checksum() - Compute IP checksum
+ *
+ * @addr:	Address to check (must be 16-bit aligned)
+ * @nbytes:	Number of bytes to check (normally a multiple of 2)
+ * Return: 16-bit IP checksum
+ */
+unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
+
+/**
+ * ip_checksum_ok() - check if a checksum is correct
+ *
+ * This works by making sure the checksum sums to 0
+ *
+ * @addr:	Address to check (must be 16-bit aligned)
+ * @nbytes:	Number of bytes to check (normally a multiple of 2)
+ * Return: true if the checksum matches, false if not
+ */
+int ip_checksum_ok(const void *addr, unsigned nbytes);
+
+/**
+ * add_ip_checksums() - add two IP checksums
+ *
+ * @offset:	Offset of first sum (if odd we do a byte-swap)
+ * @sum:	First checksum
+ * @new_sum:	New checksum to add
+ * Return: updated 16-bit IP checksum
+ */
+unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
+
+/*
+ * The devname can be either an exact name given by the driver or device tree
+ * or it can be an alias of the form "eth%d"
+ */
+struct udevice *eth_get_dev_by_name(const char *devname);
+int eth_is_active(struct udevice *dev); /* Test device for active state */
+
+/*
+ * Get the hardware address for an ethernet interface .
+ * Args:
+ *	base_name - base name for device (normally "eth")
+ *	index - device index number (0 for first)
+ *	enetaddr - returns 6 byte hardware address
+ * Returns:
+ *	Return true if the address is valid.
+ */
+int eth_env_get_enetaddr_by_index(const char *base_name, int index,
+				 uchar *enetaddr);
+
+/**
+ * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
+ *
+ * This sets up an environment variable with the given MAC address (@enetaddr).
+ * The environment variable to be set is defined by <@base_name><@index>addr.
+ * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
+ * eth1addr, etc.
+ *
+ * @base_name:  Base name for variable, typically "eth"
+ * @index:      Index of interface being updated (>=0)
+ * @enetaddr:   Pointer to MAC address to put into the variable
+ * Return: 0 if OK, other value on error
+ */
+int eth_env_set_enetaddr_by_index(const char *base_name, int index,
+				 uchar *enetaddr);
+
+/*
+ * Initialize USB ethernet device with CONFIG_DM_ETH
+ * Returns:
+ *	0 is success, non-zero is error status.
+ */
+int usb_ether_init(void);
+
+int eth_init(void);			/* Initialize the device */
+int eth_send(void *packet, int length);	   /* Send a packet */
+#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
+int eth_receive(void *packet, int length); /* Receive a packet*/
+extern void (*push_packet)(void *packet, int length);
+#endif
+int eth_rx(void);			/* Check for received packets */
+
+/**
+ * reset_phy() - Reset the Ethernet PHY
+ *
+ * This should be implemented by boards if CONFIG_RESET_PHY_R is enabled
+ */
+void reset_phy(void);
+
+#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+/**
+ * eth_set_enable_bootdevs() - Enable or disable binding of Ethernet bootdevs
+ *
+ * These get in the way of bootstd testing, so are normally disabled by tests.
+ * This provide control of this setting. It only affects binding of Ethernet
+ * devices, so if that has already happened, this flag does nothing.
+ *
+ * @enable: true to enable binding of bootdevs when binding new Ethernet
+ * devices, false to disable it
+ */
+void eth_set_enable_bootdevs(bool enable);
+#else
+static inline void eth_set_enable_bootdevs(bool enable) {}
+#endif
+
+static inline void net_send_packet(uchar *pkt, int len)
+{
+	if (DEBUG_NET_PKT_TRACE)
+		print_hex_dump_bytes("tx: ", DUMP_PREFIX_OFFSET, pkt, len);
+	/* Currently no way to return errors from eth_send() */
+	(void) eth_send(pkt, len);
+}
+
+enum eth_recv_flags {
+	/*
+	 * Check hardware device for new packets (otherwise only return those
+	 * which are already in the memory buffer ready to process)
+	 */
+	ETH_RECV_CHECK_DEVICE		= 1 << 0,
+};
+
+/**
+ * struct eth_ops - functions of Ethernet MAC controllers
+ *
+ * start: Prepare the hardware to send and receive packets
+ * send: Send the bytes passed in "packet" as a packet on the wire
+ * recv: Check if the hardware received a packet. If so, set the pointer to the
+ *	 packet buffer in the packetp parameter. If not, return an error or 0 to
+ *	 indicate that the hardware receive FIFO is empty. If 0 is returned, the
+ *	 network stack will not process the empty packet, but free_pkt() will be
+ *	 called if supplied
+ * free_pkt: Give the driver an opportunity to manage its packet buffer memory
+ *	     when the network stack is finished processing it. This will only be
+ *	     called when no error was returned from recv - optional
+ * stop: Stop the hardware from looking for packets - may be called even if
+ *	 state == PASSIVE
+ * mcast: Join or leave a multicast group (for TFTP) - optional
+ * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
+ *		 on some platforms like ARM). This function expects the
+ *		 eth_pdata::enetaddr field to be populated. The method can
+ *		 return -ENOSYS to indicate that this is not implemented for
+		 this hardware - optional.
+ * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
+ *		    ROM on the board. This is how the driver should expose it
+ *		    to the network stack. This function should fill in the
+ *		    eth_pdata::enetaddr field - optional
+ * set_promisc: Enable or Disable promiscuous mode
+ * get_sset_count: Number of statistics counters
+ * get_string: Names of the statistic counters
+ * get_stats: The values of the statistic counters
+ */
+struct eth_ops {
+	int (*start)(struct udevice *dev);
+	int (*send)(struct udevice *dev, void *packet, int length);
+	int (*recv)(struct udevice *dev, int flags, uchar **packetp);
+	int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
+	void (*stop)(struct udevice *dev);
+	int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
+	int (*write_hwaddr)(struct udevice *dev);
+	int (*read_rom_hwaddr)(struct udevice *dev);
+	int (*set_promisc)(struct udevice *dev, bool enable);
+	int (*get_sset_count)(struct udevice *dev);
+	void (*get_strings)(struct udevice *dev, u8 *data);
+	void (*get_stats)(struct udevice *dev, u64 *data);
+};
+
+#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
+
+struct udevice *eth_get_dev(void); /* get the current device */
+unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
+int eth_rx(void);                      /* Check for received packets */
+void eth_halt(void);			/* stop SCC */
+const char *eth_get_name(void);		/* get name of current device */
+int eth_get_dev_index(void);
+
+int eth_initialize(void);		/* Initialize network subsystem */
+void eth_try_another(int first_restart);	/* Change the device */
+void eth_set_current(void);		/* set nterface to ethcur var */
+
+enum eth_state_t {
+	ETH_STATE_INIT,
+	ETH_STATE_PASSIVE,
+	ETH_STATE_ACTIVE
+};
+
+/**
+ * struct eth_pdata - Platform data for Ethernet MAC controllers
+ *
+ * @iobase: The base address of the hardware registers
+ * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
+ * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
+ * @max_speed: Maximum speed of Ethernet connection supported by MAC
+ * @priv_pdata: device specific plat
+ */
+struct eth_pdata {
+	phys_addr_t iobase;
+	unsigned char enetaddr[ARP_HLEN];
+	int phy_interface;
+	int max_speed;
+	void *priv_pdata;
+};
+
+struct ethernet_hdr {
+	u8		et_dest[ARP_HLEN];	/* Destination node	*/
+	u8		et_src[ARP_HLEN];	/* Source node		*/
+	u16		et_protlen;		/* Protocol or length	*/
+} __attribute__((packed));
+
+/* Ethernet header size */
+#define ETHER_HDR_SIZE	(sizeof(struct ethernet_hdr))
+
+/**
+ * net_random_ethaddr - Generate software assigned random Ethernet address
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Generate a random Ethernet address (MAC) that is not multicast
+ * and has the local assigned bit set.
+ */
+static inline void net_random_ethaddr(uchar *addr)
+{
+	int i;
+	unsigned int seed = get_ticks();
+
+	for (i = 0; i < 6; i++)
+		addr[i] = rand_r(&seed);
+
+	addr[0] &= 0xfe;	/* clear multicast bit */
+	addr[0] |= 0x02;	/* set local assignment bit (IEEE802) */
+}
+
+/**
+ * is_zero_ethaddr - Determine if give Ethernet address is all zeros.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is all zeroes.
+ */
+static inline int is_zero_ethaddr(const u8 *addr)
+{
+	return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
+}
+
+/**
+ * is_multicast_ethaddr - Determine if the Ethernet address is a multicast.
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is a multicast address.
+ * By definition the broadcast address is also a multicast address.
+ */
+static inline int is_multicast_ethaddr(const u8 *addr)
+{
+	return 0x01 & addr[0];
+}
+
+/*
+ * is_broadcast_ethaddr - Determine if the Ethernet address is broadcast
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Return true if the address is the broadcast address.
+ */
+static inline int is_broadcast_ethaddr(const u8 *addr)
+{
+	return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
+		0xff;
+}
+
+/*
+ * is_valid_ethaddr - Determine if the given Ethernet address is valid
+ * @addr: Pointer to a six-byte array containing the Ethernet address
+ *
+ * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
+ * a multicast address, and is not FF:FF:FF:FF:FF:FF.
+ *
+ * Return true if the address is valid.
+ */
+static inline int is_valid_ethaddr(const u8 *addr)
+{
+	/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
+	 * explicitly check for it here. */
+	return !is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr);
+}
+
+/**
+ * string_to_enetaddr() - Parse a MAC address
+ *
+ * Convert a string MAC address
+ *
+ * Implemented in lib/net_utils.c (built unconditionally)
+ *
+ * @addr: MAC address in aa:bb:cc:dd:ee:ff format, where each part is a 2-digit
+ *	hex value
+ * @enetaddr: Place to put MAC address (6 bytes)
+ */
+void string_to_enetaddr(const char *addr, uint8_t *enetaddr);
+
+/**
+ * string_to_ip() - Convert a string to ip address
+ *
+ * Implemented in lib/net_utils.c (built unconditionally)
+ *
+ * @s: Input string to parse
+ * @return: in_addr struct containing the parsed IP address
+ */
+struct in_addr string_to_ip(const char *s);
+
+/* copy a filename (allow for "..." notation, limit length) */
+void copy_filename(char *dst, const char *src, int size);
+
+/* Processes a received packet */
+void net_process_received_packet(uchar *in_packet, int len);
+
+/**
+ * update_tftp - Update firmware over TFTP (via DFU)
+ *
+ * This function updates board's firmware via TFTP
+ *
+ * @param addr - memory address where data is stored
+ * @param interface - the DFU medium name - e.g. "mmc"
+ * @param devstring - the DFU medium number - e.g. "1"
+ *
+ * Return: - 0 on success, other value on failure
+ */
+int update_tftp(ulong addr, char *interface, char *devstring);
+
+/**
+ * env_get_ip() - Convert an environment value to to an ip address
+ *
+ * @var: Environment variable to convert. The value of this variable must be
+ *	in the format format a.b.c.d, where each value is a decimal number from
+ *	0 to 255
+ * Return: IP address, or 0 if invalid
+ */
+static inline struct in_addr env_get_ip(char *var)
+{
+	return string_to_ip(env_get(var));
+}
+
+int net_init(void);
+
+/**
+ * dhcp_run() - Run DHCP on the current ethernet device
+ *
+ * This sets the autoload variable, then puts it back to similar to its original
+ * state (y, n or unset).
+ *
+ * @addr: Address to load the file into (0 if @autoload is false)
+ * @fname: Filename of file to load (NULL if @autoload is false or to use the
+ * default filename)
+ * @autoload: true to load the file, false to just get the network IP
+ * @return 0 if OK, -EINVAL if the environment failed, -ENOENT if ant file was
+ * not found
+ */
+int dhcp_run(ulong addr, const char *fname, bool autoload);
+
+/**
+ * do_tftpb - Run the tftpboot command
+ *
+ * @cmdtp: Command information for tftpboot
+ * @flag: Command flags (CMD_FLAG_...)
+ * @argc: Number of arguments
+ * @argv: List of arguments
+ * Return: result (see enum command_ret_t)
+ */
+int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
+
+/**
+ * wget_with_dns() - runs dns host IP address resulution before wget
+ *
+ * @dst_addr:	destination address to download the file
+ * @uri:	uri string of target file of wget
+ * Return:	downloaded file size, negative if failed
+ */
+int wget_with_dns(ulong dst_addr, char *uri);
+/**
+ * wget_validate_uri() - varidate the uri
+ *
+ * @uri:	uri string of target file of wget
+ * Return:	true if uri is valid, false if uri is invalid
+ */
+bool wget_validate_uri(char *uri);
+//int do_wget(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);
+
+#endif /* __NET_COMMON_H__ */
diff --git a/include/net-legacy.h b/include/net-legacy.h
new file mode 100644
index 00000000000..19c991e12f6
--- /dev/null
+++ b/include/net-legacy.h
@@ -0,0 +1,544 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *	LiMon Monitor (LiMon) - Network.
+ *
+ *	Copyright 1994 - 2000 Neil Russell.
+ *	(See License)
+ *
+ * History
+ *	9/16/00	  bor  adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
+ */
+
+#ifndef __NET_LEGACY_H__
+#define __NET_LEGACY_H__
+
+#include <linux/types.h>
+#include <asm/byteorder.h>	/* for nton* / ntoh* stuff */
+#include <log.h>
+#include <time.h>
+#include <linux/if_ether.h>
+
+struct bd_info;
+struct cmd_tbl;
+struct udevice;
+
+#define DEBUG_LL_STATE 0	/* Link local state machine changes */
+#define DEBUG_DEV_PKT 0		/* Packets or info directed to the device */
+#define DEBUG_NET_PKT 0		/* Packets on info on the network at large */
+#define DEBUG_INT_STATE 0	/* Internal network state changes */
+
+/* ARP hardware address length */
+#define ARP_HLEN 6
+/*
+ * The size of a MAC address in string form, each digit requires two chars
+ * and five separator characters to form '00:00:00:00:00:00'.
+ */
+#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
+
+/**
+ * An incoming packet handler.
+ * @param pkt    pointer to the application packet
+ * @param dport  destination UDP port
+ * @param sip    source IP address
+ * @param sport  source UDP port
+ * @param len    packet length
+ */
+typedef void rxhand_f(uchar *pkt, unsigned dport,
+		      struct in_addr sip, unsigned sport,
+		      unsigned len);
+
+/**
+ * An incoming ICMP packet handler.
+ * @param type	ICMP type
+ * @param code	ICMP code
+ * @param dport	destination UDP port
+ * @param sip	source IP address
+ * @param sport	source UDP port
+ * @param pkt	pointer to the ICMP packet data
+ * @param len	packet length
+ */
+typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport,
+		struct in_addr sip, unsigned sport, uchar *pkt, unsigned len);
+
+/*
+ *	A timeout handler.  Called after time interval has expired.
+ */
+typedef void	thand_f(void);
+
+/*
+ * The devname can be either an exact name given by the driver or device tree
+ * or it can be an alias of the form "eth%d"
+ */
+struct udevice *eth_get_dev_by_name(const char *devname);
+int eth_init_state_only(void); /* Set active state */
+void eth_halt_state_only(void); /* Set passive state */
+
+/**
+ * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
+ *
+ * This sets up an environment variable with the given MAC address (@enetaddr).
+ * The environment variable to be set is defined by <@base_name><@index>addr.
+ * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
+ * eth1addr, etc.
+ *
+ * @base_name:  Base name for variable, typically "eth"
+ * @index:      Index of interface being updated (>=0)
+ * @enetaddr:   Pointer to MAC address to put into the variable
+ * Return: 0 if OK, other value on error
+ */
+int eth_env_set_enetaddr_by_index(const char *base_name, int index,
+				 uchar *enetaddr);
+
+/*
+ * Get the hardware address for an ethernet interface .
+ * Args:
+ *	base_name - base name for device (normally "eth")
+ *	index - device index number (0 for first)
+ *	enetaddr - returns 6 byte hardware address
+ * Returns:
+ *	Return true if the address is valid.
+ */
+int eth_env_get_enetaddr_by_index(const char *base_name, int index,
+				 uchar *enetaddr);
+
+int eth_send(void *packet, int length);	   /* Send a packet */
+
+#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
+int eth_receive(void *packet, int length); /* Receive a packet*/
+extern void (*push_packet)(void *packet, int length);
+#endif
+int eth_mcast_join(struct in_addr mcast_addr, int join);
+
+/**********************************************************************/
+/*
+ *	Protocol headers.
+ */
+
+#define ETH_FCS_LEN	4		/* Octets in the FCS		*/
+
+struct e802_hdr {
+	u8		et_dest[ARP_HLEN];	/* Destination node	*/
+	u8		et_src[ARP_HLEN];	/* Source node		*/
+	u16		et_protlen;		/* Protocol or length	*/
+	u8		et_dsap;		/* 802 DSAP		*/
+	u8		et_ssap;		/* 802 SSAP		*/
+	u8		et_ctl;			/* 802 control		*/
+	u8		et_snap1;		/* SNAP			*/
+	u8		et_snap2;
+	u8		et_snap3;
+	u16		et_prot;		/* 802 protocol		*/
+} __attribute__((packed));
+
+/* 802 + SNAP + ethernet header size */
+#define E802_HDR_SIZE	(sizeof(struct e802_hdr))
+
+/*
+ *	Virtual LAN Ethernet header
+ */
+struct vlan_ethernet_hdr {
+	u8		vet_dest[ARP_HLEN];	/* Destination node	*/
+	u8		vet_src[ARP_HLEN];	/* Source node		*/
+	u16		vet_vlan_type;		/* PROT_VLAN		*/
+	u16		vet_tag;		/* TAG of VLAN		*/
+	u16		vet_type;		/* protocol type	*/
+} __attribute__((packed));
+
+/* VLAN Ethernet header size */
+#define VLAN_ETHER_HDR_SIZE	(sizeof(struct vlan_ethernet_hdr))
+
+/*
+ *	Internet Protocol (IP) header.
+ */
+struct ip_hdr {
+	u8		ip_hl_v;	/* header length and version	*/
+	u8		ip_tos;		/* type of service		*/
+	u16		ip_len;		/* total length			*/
+	u16		ip_id;		/* identification		*/
+	u16		ip_off;		/* fragment offset field	*/
+	u8		ip_ttl;		/* time to live			*/
+	u8		ip_p;		/* protocol			*/
+	u16		ip_sum;		/* checksum			*/
+	struct in_addr	ip_src;		/* Source IP address		*/
+	struct in_addr	ip_dst;		/* Destination IP address	*/
+} __attribute__((packed));
+
+#define IP_OFFS		0x1fff /* ip offset *= 8 */
+#define IP_FLAGS	0xe000 /* first 3 bits */
+#define IP_FLAGS_RES	0x8000 /* reserved */
+#define IP_FLAGS_DFRAG	0x4000 /* don't fragments */
+#define IP_FLAGS_MFRAG	0x2000 /* more fragments */
+
+#define IP_HDR_SIZE		(sizeof(struct ip_hdr))
+
+#define IP_MIN_FRAG_DATAGRAM_SIZE	(IP_HDR_SIZE + 8)
+
+/*
+ *	Address Resolution Protocol (ARP) header.
+ */
+struct arp_hdr {
+	u16		ar_hrd;		/* Format of hardware address	*/
+#   define ARP_ETHER	    1		/* Ethernet  hardware address	*/
+	u16		ar_pro;		/* Format of protocol address	*/
+	u8		ar_hln;		/* Length of hardware address	*/
+	u8		ar_pln;		/* Length of protocol address	*/
+#   define ARP_PLEN	4
+	u16		ar_op;		/* Operation			*/
+#   define ARPOP_REQUEST    1		/* Request  to resolve  address	*/
+#   define ARPOP_REPLY	    2		/* Response to previous request	*/
+
+#   define RARPOP_REQUEST   3		/* Request  to resolve  address	*/
+#   define RARPOP_REPLY	    4		/* Response to previous request */
+
+	/*
+	 * The remaining fields are variable in size, according to
+	 * the sizes above, and are defined as appropriate for
+	 * specific hardware/protocol combinations.
+	 */
+	u8		ar_data[0];
+#define ar_sha		ar_data[0]
+#define ar_spa		ar_data[ARP_HLEN]
+#define ar_tha		ar_data[ARP_HLEN + ARP_PLEN]
+#define ar_tpa		ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN]
+#if 0
+	u8		ar_sha[];	/* Sender hardware address	*/
+	u8		ar_spa[];	/* Sender protocol address	*/
+	u8		ar_tha[];	/* Target hardware address	*/
+	u8		ar_tpa[];	/* Target protocol address	*/
+#endif /* 0 */
+} __attribute__((packed));
+
+
+/*
+ * ICMP stuff (just enough to handle (host) redirect messages)
+ */
+#define ICMP_ECHO_REPLY		0	/* Echo reply			*/
+#define ICMP_NOT_REACH		3	/* Detination unreachable	*/
+#define ICMP_REDIRECT		5	/* Redirect (change route)	*/
+#define ICMP_ECHO_REQUEST	8	/* Echo request			*/
+
+/* Codes for REDIRECT. */
+#define ICMP_REDIR_NET		0	/* Redirect Net			*/
+#define ICMP_REDIR_HOST		1	/* Redirect Host		*/
+
+/* Codes for NOT_REACH */
+#define ICMP_NOT_REACH_PORT	3	/* Port unreachable		*/
+
+struct icmp_hdr {
+	u8		type;
+	u8		code;
+	u16		checksum;
+	union {
+		struct {
+			u16	id;
+			u16	sequence;
+		} echo;
+		u32	gateway;
+		struct {
+			u16	unused;
+			u16	mtu;
+		} frag;
+		u8 data[0];
+	} un;
+} __attribute__((packed));
+
+#define ICMP_HDR_SIZE		(sizeof(struct icmp_hdr))
+#define IP_ICMP_HDR_SIZE	(IP_HDR_SIZE + ICMP_HDR_SIZE)
+
+/*
+ * Maximum packet size; used to allocate packet storage. Use
+ * the maxium Ethernet frame size as specified by the Ethernet
+ * standard including the 802.1Q tag (VLAN tagging).
+ * maximum packet size =  1522
+ * maximum packet size and multiple of 32 bytes =  1536
+ */
+#define PKTSIZE			1522
+#ifndef CONFIG_DM_DSA
+#define PKTSIZE_ALIGN		1536
+#else
+/* Maximum DSA tagging overhead (headroom and/or tailroom) */
+#define DSA_MAX_OVR		256
+#define PKTSIZE_ALIGN		(1536 + DSA_MAX_OVR)
+#endif
+
+/**********************************************************************/
+/*
+ *	Globals.
+ *
+ * Note:
+ *
+ * All variables of type struct in_addr are stored in NETWORK byte order
+ * (big endian).
+ */
+
+/* net.c */
+/** BOOTP EXTENTIONS **/
+extern struct in_addr net_gateway;	/* Our gateway IP address */
+extern struct in_addr net_netmask;	/* Our subnet mask (0 = unknown) */
+/* Our Domain Name Server (0 = unknown) */
+extern struct in_addr net_dns_server;
+#if defined(CONFIG_BOOTP_DNS2)
+/* Our 2nd Domain Name Server (0 = unknown) */
+extern struct in_addr net_dns_server2;
+#endif
+extern char	net_nis_domain[32];	/* Our IS domain */
+extern char	net_hostname[32];	/* Our hostname */
+#ifdef CONFIG_NET
+extern char	net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN];	/* Our root path */
+#endif
+/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
+extern char *pxelinux_configfile;
+/** END OF BOOTP EXTENTIONS **/
+extern u8		net_ethaddr[ARP_HLEN];		/* Our ethernet address */
+extern u8		net_server_ethaddr[ARP_HLEN];	/* Boot server enet address */
+extern struct in_addr	net_ip;		/* Our    IP addr (0 = unknown) */
+extern struct in_addr	net_server_ip;	/* Server IP addr (0 = unknown) */
+extern uchar		*net_tx_packet;		/* THE transmit packet */
+extern uchar		*net_rx_packets[PKTBUFSRX]; /* Receive packets */
+extern uchar		*net_rx_packet;		/* Current receive packet */
+extern int		net_rx_packet_len;	/* Current rx packet length */
+extern const u8		net_null_ethaddr[ARP_HLEN];
+
+#define VLAN_NONE	4095			/* untagged */
+#define VLAN_IDMASK	0x0fff			/* mask of valid vlan id */
+extern ushort		net_our_vlan;		/* Our VLAN */
+extern ushort		net_native_vlan;	/* Our Native VLAN */
+
+extern int		net_restart_wrap;	/* Tried all network devices */
+
+enum proto_t {
+	BOOTP, RARP, ARP, TFTPGET, DHCP, DHCP6, PING, PING6, DNS, NFS, CDP,
+	NETCONS, SNTP, TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT_UDP, FASTBOOT_TCP,
+	WOL, UDP, NCSI, WGET, RS
+};
+/* Indicates whether the file name was specified on the command line */
+extern bool	net_boot_file_name_explicit;
+/* The actual transferred size of the bootfile (in bytes) */
+extern u32	net_boot_file_size;
+/* Boot file size in blocks as reported by the DHCP server */
+extern u32	net_boot_file_expected_size_in_blocks;
+
+#if defined(CONFIG_CMD_DNS)
+extern char *net_dns_resolve;		/* The host to resolve  */
+extern char *net_dns_env_var;		/* the env var to put the ip into */
+#endif
+
+#if defined(CONFIG_CMD_PING)
+extern struct in_addr net_ping_ip;	/* the ip address to ping */
+#endif
+
+#if defined(CONFIG_CMD_CDP)
+/* when CDP completes these hold the return values */
+extern ushort cdp_native_vlan;		/* CDP returned native VLAN */
+extern ushort cdp_appliance_vlan;	/* CDP returned appliance VLAN */
+
+/*
+ * Check for a CDP packet by examining the received MAC address field
+ */
+static inline int is_cdp_packet(const uchar *ethaddr)
+{
+	extern const u8 net_cdp_ethaddr[ARP_HLEN];
+
+	return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
+}
+#endif
+
+#if defined(CONFIG_CMD_SNTP)
+extern struct in_addr	net_ntp_server;		/* the ip address to NTP */
+extern int net_ntp_time_offset;			/* offset time from UTC */
+#endif
+
+int net_loop(enum proto_t);
+
+/* Load failed.	 Start again. */
+int net_start_again(void);
+
+/* Get size of the ethernet header when we send */
+int net_eth_hdr_size(void);
+
+/* Set ethernet header; returns the size of the header */
+int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
+int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
+
+/* Set IP header */
+void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
+		       u16 pkt_len, u8 proto);
+void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
+				int sport, int len);
+
+/* Callbacks */
+rxhand_f *net_get_udp_handler(void);	/* Get UDP RX packet handler */
+void net_set_udp_handler(rxhand_f *);	/* Set UDP RX packet handler */
+rxhand_f *net_get_arp_handler(void);	/* Get ARP RX packet handler */
+void net_set_arp_handler(rxhand_f *);	/* Set ARP RX packet handler */
+bool arp_is_waiting(void);		/* Waiting for ARP reply? */
+void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
+void net_set_timeout_handler(ulong, thand_f *);/* Set timeout handler */
+
+/* Network loop state */
+enum net_loop_state {
+	NETLOOP_CONTINUE,
+	NETLOOP_RESTART,
+	NETLOOP_SUCCESS,
+	NETLOOP_FAIL
+};
+extern enum net_loop_state net_state;
+
+static inline void net_set_state(enum net_loop_state state)
+{
+	debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state);
+	net_state = state;
+}
+
+/*
+ * net_get_async_tx_pkt_buf - Get a packet buffer that is not in use for
+ *			      sending an asynchronous reply
+ *
+ * returns - ptr to packet buffer
+ */
+uchar * net_get_async_tx_pkt_buf(void);
+
+/**
+ * net_send_ip_packet() - Transmit "net_tx_packet" as UDP or TCP packet,
+ *                        send ARP request if needed (ether will be populated)
+ * @ether: Raw packet buffer
+ * @dest: IP address to send the datagram to
+ * @dport: Destination UDP port
+ * @sport: Source UDP port
+ * @payload_len: Length of data after the UDP header
+ * @action: TCP action to be performed
+ * @tcp_seq_num: TCP sequence number of this transmission
+ * @tcp_ack_num: TCP stream acknolegement number
+ *
+ * Return: 0 on success, other value on failure
+ */
+int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
+		       int payload_len, int proto, u8 action, u32 tcp_seq_num,
+		       u32 tcp_ack_num);
+/**
+ * net_send_tcp_packet() - Transmit TCP packet.
+ * @payload_len: length of payload
+ * @dport: Destination TCP port
+ * @sport: Source TCP port
+ * @action: TCP action to be performed
+ * @tcp_seq_num: TCP sequence number of this transmission
+ * @tcp_ack_num: TCP stream acknolegement number
+ *
+ * Return: 0 on success, other value on failure
+ */
+int net_send_tcp_packet(int payload_len, int dport, int sport, u8 action,
+			u32 tcp_seq_num, u32 tcp_ack_num);
+int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
+			int sport, int payload_len);
+
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
+void nc_start(void);
+int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
+	unsigned src_port, unsigned len);
+#endif
+
+static __always_inline int eth_is_on_demand_init(void)
+{
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
+	extern enum proto_t net_loop_last_protocol;
+
+	return net_loop_last_protocol != NETCONS;
+#else
+	return 1;
+#endif
+}
+
+static inline void eth_set_last_protocol(int protocol)
+{
+#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
+	extern enum proto_t net_loop_last_protocol;
+
+	net_loop_last_protocol = protocol;
+#endif
+}
+
+/*
+ * Check if autoload is enabled. If so, use either NFS or TFTP to download
+ * the boot file.
+ */
+void net_auto_load(void);
+
+/*
+ * The following functions are a bit ugly, but necessary to deal with
+ * alignment restrictions on ARM.
+ *
+ * We're using inline functions, which had the smallest memory
+ * footprint in our tests.
+ */
+/* return IP *in network byteorder* */
+static inline struct in_addr net_read_ip(void *from)
+{
+	struct in_addr ip;
+
+	memcpy((void *)&ip, (void *)from, sizeof(ip));
+	return ip;
+}
+
+/* return ulong *in network byteorder* */
+static inline u32 net_read_u32(void *from)
+{
+	u32 l;
+
+	memcpy((void *)&l, (void *)from, sizeof(l));
+	return l;
+}
+
+/* write IP *in network byteorder* */
+static inline void net_write_ip(void *to, struct in_addr ip)
+{
+	memcpy(to, (void *)&ip, sizeof(ip));
+}
+
+/* copy IP */
+static inline void net_copy_ip(void *to, void *from)
+{
+	memcpy((void *)to, from, sizeof(struct in_addr));
+}
+
+/* copy ulong */
+static inline void net_copy_u32(void *to, void *from)
+{
+	memcpy((void *)to, (void *)from, sizeof(u32));
+}
+
+/* Convert an IP address to a string */
+void ip_to_string(struct in_addr x, char *s);
+
+/**
+ * string_to_ip() - Convert a string to ip address
+ *
+ * Implemented in lib/net_utils.c (built unconditionally)
+ *
+ * @s: Input string to parse
+ * @return: in_addr struct containing the parsed IP address
+ */
+struct in_addr string_to_ip(const char *s);
+
+/* Convert a VLAN id to a string */
+void vlan_to_string(ushort x, char *s);
+
+/* Convert a string to a vlan id */
+ushort string_to_vlan(const char *s);
+
+/* read a VLAN id from an environment variable */
+ushort env_get_vlan(char *);
+
+/* check if serverip is specified in filename from the command line */
+int is_serverip_in_cmd(void);
+
+/**
+ * net_parse_bootfile - Parse the bootfile env var / cmd line param
+ *
+ * @param ipaddr - a pointer to the ipaddr to populate if included in bootfile
+ * @param filename - a pointer to the string to save the filename part
+ * @param max_len - The longest - 1 that the filename part can be
+ *
+ * return 1 if parsed, 0 if bootfile is empty
+ */
+int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
+
+#endif /* __NET_LEGACY_H__ */
diff --git a/include/net-lwip.h b/include/net-lwip.h
new file mode 100644
index 00000000000..5c3f9e7e86c
--- /dev/null
+++ b/include/net-lwip.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __NET_LWIP_H__
+#define __NET_LWIP_H__
+
+#include <lwip/ip4.h>
+#include <lwip/netif.h>
+
+struct netif *net_lwip_new_netif(struct udevice *udev);
+struct netif *net_lwip_new_netif_noip(struct udevice *udev);
+void net_lwip_remove_netif(struct netif *netif);
+struct netif *net_lwip_get_netif(void);
+
+#endif /* __NET_LWIP_H__ */
diff --git a/include/net.h b/include/net.h
index bb2ae20f52a..afa46f239ee 100644
--- a/include/net.h
+++ b/include/net.h
@@ -1,949 +1,14 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/*
- *	LiMon Monitor (LiMon) - Network.
- *
- *	Copyright 1994 - 2000 Neil Russell.
- *	(See License)
- *
- * History
- *	9/16/00	  bor  adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
- */
 
 #ifndef __NET_H__
 #define __NET_H__
 
-#include <linux/types.h>
-#include <asm/cache.h>
-#include <asm/byteorder.h>	/* for nton* / ntoh* stuff */
-#include <env.h>
-#include <hexdump.h>
-#include <log.h>
-#include <time.h>
-#include <linux/if_ether.h>
-#include <rand.h>
+#include <net-common.h>
 
-struct bd_info;
-struct cmd_tbl;
-struct udevice;
-
-#define DEBUG_LL_STATE 0	/* Link local state machine changes */
-#define DEBUG_DEV_PKT 0		/* Packets or info directed to the device */
-#define DEBUG_NET_PKT 0		/* Packets on info on the network at large */
-#define DEBUG_INT_STATE 0	/* Internal network state changes */
-#define DEBUG_NET_PKT_TRACE 0	/* Trace all packet data */
-
-/*
- *	The number of receive packet buffers, and the required packet buffer
- *	alignment in memory.
- *
- */
-#define PKTBUFSRX	CONFIG_SYS_RX_ETH_BUFFER
-#define PKTALIGN	ARCH_DMA_MINALIGN
-
-/* Number of packets processed together */
-#define ETH_PACKETS_BATCH_RECV	32
-
-/* ARP hardware address length */
-#define ARP_HLEN 6
-/*
- * The size of a MAC address in string form, each digit requires two chars
- * and five separator characters to form '00:00:00:00:00:00'.
- */
-#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
-
-/* IPv4 addresses are always 32 bits in size */
-struct in_addr {
-	__be32 s_addr;
-};
-
-/**
- * do_tftpb - Run the tftpboot command
- *
- * @cmdtp: Command information for tftpboot
- * @flag: Command flags (CMD_FLAG_...)
- * @argc: Number of arguments
- * @argv: List of arguments
- * Return: result (see enum command_ret_t)
- */
-int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
-
-/**
- * dhcp_run() - Run DHCP on the current ethernet device
- *
- * This sets the autoload variable, then puts it back to similar to its original
- * state (y, n or unset).
- *
- * @addr: Address to load the file into (0 if @autoload is false)
- * @fname: Filename of file to load (NULL if @autoload is false or to use the
- * default filename)
- * @autoload: true to load the file, false to just get the network IP
- * @return 0 if OK, -EINVAL if the environment failed, -ENOENT if ant file was
- * not found
- */
-int dhcp_run(ulong addr, const char *fname, bool autoload);
-
-/**
- * An incoming packet handler.
- * @param pkt    pointer to the application packet
- * @param dport  destination UDP port
- * @param sip    source IP address
- * @param sport  source UDP port
- * @param len    packet length
- */
-typedef void rxhand_f(uchar *pkt, unsigned dport,
-		      struct in_addr sip, unsigned sport,
-		      unsigned len);
-
-/**
- * An incoming ICMP packet handler.
- * @param type	ICMP type
- * @param code	ICMP code
- * @param dport	destination UDP port
- * @param sip	source IP address
- * @param sport	source UDP port
- * @param pkt	pointer to the ICMP packet data
- * @param len	packet length
- */
-typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport,
-		struct in_addr sip, unsigned sport, uchar *pkt, unsigned len);
-
-/*
- *	A timeout handler.  Called after time interval has expired.
- */
-typedef void	thand_f(void);
-
-enum eth_state_t {
-	ETH_STATE_INIT,
-	ETH_STATE_PASSIVE,
-	ETH_STATE_ACTIVE
-};
-
-/**
- * struct eth_pdata - Platform data for Ethernet MAC controllers
- *
- * @iobase: The base address of the hardware registers
- * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
- * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
- * @max_speed: Maximum speed of Ethernet connection supported by MAC
- * @priv_pdata: device specific plat
- */
-struct eth_pdata {
-	phys_addr_t iobase;
-	unsigned char enetaddr[ARP_HLEN];
-	int phy_interface;
-	int max_speed;
-	void *priv_pdata;
-};
-
-enum eth_recv_flags {
-	/*
-	 * Check hardware device for new packets (otherwise only return those
-	 * which are already in the memory buffer ready to process)
-	 */
-	ETH_RECV_CHECK_DEVICE		= 1 << 0,
-};
-
-/**
- * struct eth_ops - functions of Ethernet MAC controllers
- *
- * start: Prepare the hardware to send and receive packets
- * send: Send the bytes passed in "packet" as a packet on the wire
- * recv: Check if the hardware received a packet. If so, set the pointer to the
- *	 packet buffer in the packetp parameter. If not, return an error or 0 to
- *	 indicate that the hardware receive FIFO is empty. If 0 is returned, the
- *	 network stack will not process the empty packet, but free_pkt() will be
- *	 called if supplied
- * free_pkt: Give the driver an opportunity to manage its packet buffer memory
- *	     when the network stack is finished processing it. This will only be
- *	     called when no error was returned from recv - optional
- * stop: Stop the hardware from looking for packets - may be called even if
- *	 state == PASSIVE
- * mcast: Join or leave a multicast group (for TFTP) - optional
- * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
- *		 on some platforms like ARM). This function expects the
- *		 eth_pdata::enetaddr field to be populated. The method can
- *		 return -ENOSYS to indicate that this is not implemented for
-		 this hardware - optional.
- * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
- *		    ROM on the board. This is how the driver should expose it
- *		    to the network stack. This function should fill in the
- *		    eth_pdata::enetaddr field - optional
- * set_promisc: Enable or Disable promiscuous mode
- * get_sset_count: Number of statistics counters
- * get_string: Names of the statistic counters
- * get_stats: The values of the statistic counters
- */
-struct eth_ops {
-	int (*start)(struct udevice *dev);
-	int (*send)(struct udevice *dev, void *packet, int length);
-	int (*recv)(struct udevice *dev, int flags, uchar **packetp);
-	int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
-	void (*stop)(struct udevice *dev);
-	int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
-	int (*write_hwaddr)(struct udevice *dev);
-	int (*read_rom_hwaddr)(struct udevice *dev);
-	int (*set_promisc)(struct udevice *dev, bool enable);
-	int (*get_sset_count)(struct udevice *dev);
-	void (*get_strings)(struct udevice *dev, u8 *data);
-	void (*get_stats)(struct udevice *dev, u64 *data);
-};
-
-#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
-
-struct udevice *eth_get_dev(void); /* get the current device */
-/*
- * The devname can be either an exact name given by the driver or device tree
- * or it can be an alias of the form "eth%d"
- */
-struct udevice *eth_get_dev_by_name(const char *devname);
-unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
-
-/* Used only when NetConsole is enabled */
-int eth_is_active(struct udevice *dev); /* Test device for active state */
-int eth_init_state_only(void); /* Set active state */
-void eth_halt_state_only(void); /* Set passive state */
-
-int eth_initialize(void);		/* Initialize network subsystem */
-void eth_try_another(int first_restart);	/* Change the device */
-void eth_set_current(void);		/* set nterface to ethcur var */
-
-int eth_get_dev_index(void);		/* get the device index */
-
-/**
- * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
- *
- * This sets up an environment variable with the given MAC address (@enetaddr).
- * The environment variable to be set is defined by <@base_name><@index>addr.
- * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
- * eth1addr, etc.
- *
- * @base_name:  Base name for variable, typically "eth"
- * @index:      Index of interface being updated (>=0)
- * @enetaddr:   Pointer to MAC address to put into the variable
- * Return: 0 if OK, other value on error
- */
-int eth_env_set_enetaddr_by_index(const char *base_name, int index,
-				 uchar *enetaddr);
-
-/*
- * Initialize USB ethernet device with CONFIG_DM_ETH
- * Returns:
- *	0 is success, non-zero is error status.
- */
-int usb_ether_init(void);
-
-/*
- * Get the hardware address for an ethernet interface .
- * Args:
- *	base_name - base name for device (normally "eth")
- *	index - device index number (0 for first)
- *	enetaddr - returns 6 byte hardware address
- * Returns:
- *	Return true if the address is valid.
- */
-int eth_env_get_enetaddr_by_index(const char *base_name, int index,
-				 uchar *enetaddr);
-
-int eth_init(void);			/* Initialize the device */
-int eth_send(void *packet, int length);	   /* Send a packet */
-
-#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
-int eth_receive(void *packet, int length); /* Receive a packet*/
-extern void (*push_packet)(void *packet, int length);
-#endif
-int eth_rx(void);			/* Check for received packets */
-void eth_halt(void);			/* stop SCC */
-const char *eth_get_name(void);		/* get name of current device */
-int eth_mcast_join(struct in_addr mcast_addr, int join);
-
-/**********************************************************************/
-/*
- *	Protocol headers.
- */
-
-/*
- *	Ethernet header
- */
-
-struct ethernet_hdr {
-	u8		et_dest[ARP_HLEN];	/* Destination node	*/
-	u8		et_src[ARP_HLEN];	/* Source node		*/
-	u16		et_protlen;		/* Protocol or length	*/
-} __attribute__((packed));
-
-/* Ethernet header size */
-#define ETHER_HDR_SIZE	(sizeof(struct ethernet_hdr))
-
-#define ETH_FCS_LEN	4		/* Octets in the FCS		*/
-
-struct e802_hdr {
-	u8		et_dest[ARP_HLEN];	/* Destination node	*/
-	u8		et_src[ARP_HLEN];	/* Source node		*/
-	u16		et_protlen;		/* Protocol or length	*/
-	u8		et_dsap;		/* 802 DSAP		*/
-	u8		et_ssap;		/* 802 SSAP		*/
-	u8		et_ctl;			/* 802 control		*/
-	u8		et_snap1;		/* SNAP			*/
-	u8		et_snap2;
-	u8		et_snap3;
-	u16		et_prot;		/* 802 protocol		*/
-} __attribute__((packed));
-
-/* 802 + SNAP + ethernet header size */
-#define E802_HDR_SIZE	(sizeof(struct e802_hdr))
-
-/*
- *	Virtual LAN Ethernet header
- */
-struct vlan_ethernet_hdr {
-	u8		vet_dest[ARP_HLEN];	/* Destination node	*/
-	u8		vet_src[ARP_HLEN];	/* Source node		*/
-	u16		vet_vlan_type;		/* PROT_VLAN		*/
-	u16		vet_tag;		/* TAG of VLAN		*/
-	u16		vet_type;		/* protocol type	*/
-} __attribute__((packed));
-
-/* VLAN Ethernet header size */
-#define VLAN_ETHER_HDR_SIZE	(sizeof(struct vlan_ethernet_hdr))
-
-#define PROT_IP		0x0800		/* IP protocol			*/
-#define PROT_ARP	0x0806		/* IP ARP protocol		*/
-#define PROT_WOL	0x0842		/* ether-wake WoL protocol	*/
-#define PROT_RARP	0x8035		/* IP ARP protocol		*/
-#define PROT_VLAN	0x8100		/* IEEE 802.1q protocol		*/
-#define PROT_IPV6	0x86dd		/* IPv6 over bluebook		*/
-#define PROT_PPP_SES	0x8864		/* PPPoE session messages	*/
-#define PROT_NCSI	0x88f8		/* NC-SI control packets        */
-
-#define IPPROTO_ICMP	 1	/* Internet Control Message Protocol	*/
-#define IPPROTO_TCP	6	/* Transmission Control Protocol	*/
-#define IPPROTO_UDP	17	/* User Datagram Protocol		*/
-
-/*
- *	Internet Protocol (IP) header.
- */
-struct ip_hdr {
-	u8		ip_hl_v;	/* header length and version	*/
-	u8		ip_tos;		/* type of service		*/
-	u16		ip_len;		/* total length			*/
-	u16		ip_id;		/* identification		*/
-	u16		ip_off;		/* fragment offset field	*/
-	u8		ip_ttl;		/* time to live			*/
-	u8		ip_p;		/* protocol			*/
-	u16		ip_sum;		/* checksum			*/
-	struct in_addr	ip_src;		/* Source IP address		*/
-	struct in_addr	ip_dst;		/* Destination IP address	*/
-} __attribute__((packed));
-
-#define IP_OFFS		0x1fff /* ip offset *= 8 */
-#define IP_FLAGS	0xe000 /* first 3 bits */
-#define IP_FLAGS_RES	0x8000 /* reserved */
-#define IP_FLAGS_DFRAG	0x4000 /* don't fragments */
-#define IP_FLAGS_MFRAG	0x2000 /* more fragments */
-
-#define IP_HDR_SIZE		(sizeof(struct ip_hdr))
-
-#define IP_MIN_FRAG_DATAGRAM_SIZE	(IP_HDR_SIZE + 8)
-
-/*
- *	Internet Protocol (IP) + UDP header.
- */
-struct ip_udp_hdr {
-	u8		ip_hl_v;	/* header length and version	*/
-	u8		ip_tos;		/* type of service		*/
-	u16		ip_len;		/* total length			*/
-	u16		ip_id;		/* identification		*/
-	u16		ip_off;		/* fragment offset field	*/
-	u8		ip_ttl;		/* time to live			*/
-	u8		ip_p;		/* protocol			*/
-	u16		ip_sum;		/* checksum			*/
-	struct in_addr	ip_src;		/* Source IP address		*/
-	struct in_addr	ip_dst;		/* Destination IP address	*/
-	u16		udp_src;	/* UDP source port		*/
-	u16		udp_dst;	/* UDP destination port		*/
-	u16		udp_len;	/* Length of UDP packet		*/
-	u16		udp_xsum;	/* Checksum			*/
-} __attribute__((packed));
-
-#define IP_UDP_HDR_SIZE		(sizeof(struct ip_udp_hdr))
-#define UDP_HDR_SIZE		(IP_UDP_HDR_SIZE - IP_HDR_SIZE)
-
-/*
- *	Address Resolution Protocol (ARP) header.
- */
-struct arp_hdr {
-	u16		ar_hrd;		/* Format of hardware address	*/
-#   define ARP_ETHER	    1		/* Ethernet  hardware address	*/
-	u16		ar_pro;		/* Format of protocol address	*/
-	u8		ar_hln;		/* Length of hardware address	*/
-	u8		ar_pln;		/* Length of protocol address	*/
-#   define ARP_PLEN	4
-	u16		ar_op;		/* Operation			*/
-#   define ARPOP_REQUEST    1		/* Request  to resolve  address	*/
-#   define ARPOP_REPLY	    2		/* Response to previous request	*/
-
-#   define RARPOP_REQUEST   3		/* Request  to resolve  address	*/
-#   define RARPOP_REPLY	    4		/* Response to previous request */
-
-	/*
-	 * The remaining fields are variable in size, according to
-	 * the sizes above, and are defined as appropriate for
-	 * specific hardware/protocol combinations.
-	 */
-	u8		ar_data[0];
-#define ar_sha		ar_data[0]
-#define ar_spa		ar_data[ARP_HLEN]
-#define ar_tha		ar_data[ARP_HLEN + ARP_PLEN]
-#define ar_tpa		ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN]
-#if 0
-	u8		ar_sha[];	/* Sender hardware address	*/
-	u8		ar_spa[];	/* Sender protocol address	*/
-	u8		ar_tha[];	/* Target hardware address	*/
-	u8		ar_tpa[];	/* Target protocol address	*/
-#endif /* 0 */
-} __attribute__((packed));
-
-#define ARP_HDR_SIZE	(8+20)		/* Size assuming ethernet	*/
-
-/*
- * ICMP stuff (just enough to handle (host) redirect messages)
- */
-#define ICMP_ECHO_REPLY		0	/* Echo reply			*/
-#define ICMP_NOT_REACH		3	/* Detination unreachable	*/
-#define ICMP_REDIRECT		5	/* Redirect (change route)	*/
-#define ICMP_ECHO_REQUEST	8	/* Echo request			*/
-
-/* Codes for REDIRECT. */
-#define ICMP_REDIR_NET		0	/* Redirect Net			*/
-#define ICMP_REDIR_HOST		1	/* Redirect Host		*/
-
-/* Codes for NOT_REACH */
-#define ICMP_NOT_REACH_PORT	3	/* Port unreachable		*/
-
-struct icmp_hdr {
-	u8		type;
-	u8		code;
-	u16		checksum;
-	union {
-		struct {
-			u16	id;
-			u16	sequence;
-		} echo;
-		u32	gateway;
-		struct {
-			u16	unused;
-			u16	mtu;
-		} frag;
-		u8 data[0];
-	} un;
-} __attribute__((packed));
-
-#define ICMP_HDR_SIZE		(sizeof(struct icmp_hdr))
-#define IP_ICMP_HDR_SIZE	(IP_HDR_SIZE + ICMP_HDR_SIZE)
-
-/*
- * Maximum packet size; used to allocate packet storage. Use
- * the maxium Ethernet frame size as specified by the Ethernet
- * standard including the 802.1Q tag (VLAN tagging).
- * maximum packet size =  1522
- * maximum packet size and multiple of 32 bytes =  1536
- */
-#define PKTSIZE			1522
-#ifndef CONFIG_DM_DSA
-#define PKTSIZE_ALIGN		1536
+#if defined(CONFIG_NET_LWIP)
+#include <net-lwip.h>
 #else
-/* Maximum DSA tagging overhead (headroom and/or tailroom) */
-#define DSA_MAX_OVR		256
-#define PKTSIZE_ALIGN		(1536 + DSA_MAX_OVR)
-#endif
-
-/*
- * Maximum receive ring size; that is, the number of packets
- * we can buffer before overflow happens. Basically, this just
- * needs to be enough to prevent a packet being discarded while
- * we are processing the previous one.
- */
-#define RINGSZ		4
-#define RINGSZ_LOG2	2
-
-/**********************************************************************/
-/*
- *	Globals.
- *
- * Note:
- *
- * All variables of type struct in_addr are stored in NETWORK byte order
- * (big endian).
- */
-
-/* net.c */
-/** BOOTP EXTENTIONS **/
-extern struct in_addr net_gateway;	/* Our gateway IP address */
-extern struct in_addr net_netmask;	/* Our subnet mask (0 = unknown) */
-/* Our Domain Name Server (0 = unknown) */
-extern struct in_addr net_dns_server;
-#if defined(CONFIG_BOOTP_DNS2)
-/* Our 2nd Domain Name Server (0 = unknown) */
-extern struct in_addr net_dns_server2;
+#include <net-legacy.h>
 #endif
-extern char	net_nis_domain[32];	/* Our IS domain */
-extern char	net_hostname[32];	/* Our hostname */
-#ifdef CONFIG_NET
-extern char	net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN];	/* Our root path */
-#endif
-/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
-extern char *pxelinux_configfile;
-/** END OF BOOTP EXTENTIONS **/
-extern u8		net_ethaddr[ARP_HLEN];		/* Our ethernet address */
-extern u8		net_server_ethaddr[ARP_HLEN];	/* Boot server enet address */
-extern struct in_addr	net_ip;		/* Our    IP addr (0 = unknown) */
-extern struct in_addr	net_server_ip;	/* Server IP addr (0 = unknown) */
-extern uchar		*net_tx_packet;		/* THE transmit packet */
-extern uchar		*net_rx_packets[PKTBUFSRX]; /* Receive packets */
-extern uchar		*net_rx_packet;		/* Current receive packet */
-extern int		net_rx_packet_len;	/* Current rx packet length */
-extern const u8		net_bcast_ethaddr[ARP_HLEN];	/* Ethernet broadcast address */
-extern const u8		net_null_ethaddr[ARP_HLEN];
-
-#define VLAN_NONE	4095			/* untagged */
-#define VLAN_IDMASK	0x0fff			/* mask of valid vlan id */
-extern ushort		net_our_vlan;		/* Our VLAN */
-extern ushort		net_native_vlan;	/* Our Native VLAN */
-
-extern int		net_restart_wrap;	/* Tried all network devices */
-
-enum proto_t {
-	BOOTP, RARP, ARP, TFTPGET, DHCP, DHCP6, PING, PING6, DNS, NFS, CDP,
-	NETCONS, SNTP, TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT_UDP, FASTBOOT_TCP,
-	WOL, UDP, NCSI, WGET, RS
-};
-
-extern char	net_boot_file_name[1024];/* Boot File name */
-/* Indicates whether the file name was specified on the command line */
-extern bool	net_boot_file_name_explicit;
-/* The actual transferred size of the bootfile (in bytes) */
-extern u32	net_boot_file_size;
-/* Boot file size in blocks as reported by the DHCP server */
-extern u32	net_boot_file_expected_size_in_blocks;
-
-#if defined(CONFIG_CMD_DNS)
-extern char *net_dns_resolve;		/* The host to resolve  */
-extern char *net_dns_env_var;		/* the env var to put the ip into */
-#endif
-
-#if defined(CONFIG_CMD_PING)
-extern struct in_addr net_ping_ip;	/* the ip address to ping */
-#endif
-
-#if defined(CONFIG_CMD_CDP)
-/* when CDP completes these hold the return values */
-extern ushort cdp_native_vlan;		/* CDP returned native VLAN */
-extern ushort cdp_appliance_vlan;	/* CDP returned appliance VLAN */
-
-/*
- * Check for a CDP packet by examining the received MAC address field
- */
-static inline int is_cdp_packet(const uchar *ethaddr)
-{
-	extern const u8 net_cdp_ethaddr[ARP_HLEN];
-
-	return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
-}
-#endif
-
-#if defined(CONFIG_CMD_SNTP)
-extern struct in_addr	net_ntp_server;		/* the ip address to NTP */
-extern int net_ntp_time_offset;			/* offset time from UTC */
-#endif
-
-/* Initialize the network adapter */
-int net_init(void);
-int net_loop(enum proto_t);
-
-/* Load failed.	 Start again. */
-int net_start_again(void);
-
-/* Get size of the ethernet header when we send */
-int net_eth_hdr_size(void);
-
-/* Set ethernet header; returns the size of the header */
-int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
-int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
-
-/* Set IP header */
-void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
-		       u16 pkt_len, u8 proto);
-void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
-				int sport, int len);
-
-/**
- * compute_ip_checksum() - Compute IP checksum
- *
- * @addr:	Address to check (must be 16-bit aligned)
- * @nbytes:	Number of bytes to check (normally a multiple of 2)
- * Return: 16-bit IP checksum
- */
-unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
-
-/**
- * add_ip_checksums() - add two IP checksums
- *
- * @offset:	Offset of first sum (if odd we do a byte-swap)
- * @sum:	First checksum
- * @new_sum:	New checksum to add
- * Return: updated 16-bit IP checksum
- */
-unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
-
-/**
- * ip_checksum_ok() - check if a checksum is correct
- *
- * This works by making sure the checksum sums to 0
- *
- * @addr:	Address to check (must be 16-bit aligned)
- * @nbytes:	Number of bytes to check (normally a multiple of 2)
- * Return: true if the checksum matches, false if not
- */
-int ip_checksum_ok(const void *addr, unsigned nbytes);
-
-/* Callbacks */
-rxhand_f *net_get_udp_handler(void);	/* Get UDP RX packet handler */
-void net_set_udp_handler(rxhand_f *);	/* Set UDP RX packet handler */
-rxhand_f *net_get_arp_handler(void);	/* Get ARP RX packet handler */
-void net_set_arp_handler(rxhand_f *);	/* Set ARP RX packet handler */
-bool arp_is_waiting(void);		/* Waiting for ARP reply? */
-void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
-void net_set_timeout_handler(ulong, thand_f *);/* Set timeout handler */
-
-/* Network loop state */
-enum net_loop_state {
-	NETLOOP_CONTINUE,
-	NETLOOP_RESTART,
-	NETLOOP_SUCCESS,
-	NETLOOP_FAIL
-};
-extern enum net_loop_state net_state;
-
-static inline void net_set_state(enum net_loop_state state)
-{
-	debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state);
-	net_state = state;
-}
-
-/*
- * net_get_async_tx_pkt_buf - Get a packet buffer that is not in use for
- *			      sending an asynchronous reply
- *
- * returns - ptr to packet buffer
- */
-uchar * net_get_async_tx_pkt_buf(void);
-
-/* Transmit a packet */
-static inline void net_send_packet(uchar *pkt, int len)
-{
-	if (DEBUG_NET_PKT_TRACE)
-		print_hex_dump_bytes("tx: ", DUMP_PREFIX_OFFSET, pkt, len);
-	/* Currently no way to return errors from eth_send() */
-	(void) eth_send(pkt, len);
-}
-
-/**
- * net_send_ip_packet() - Transmit "net_tx_packet" as UDP or TCP packet,
- *                        send ARP request if needed (ether will be populated)
- * @ether: Raw packet buffer
- * @dest: IP address to send the datagram to
- * @dport: Destination UDP port
- * @sport: Source UDP port
- * @payload_len: Length of data after the UDP header
- * @action: TCP action to be performed
- * @tcp_seq_num: TCP sequence number of this transmission
- * @tcp_ack_num: TCP stream acknolegement number
- *
- * Return: 0 on success, other value on failure
- */
-int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
-		       int payload_len, int proto, u8 action, u32 tcp_seq_num,
-		       u32 tcp_ack_num);
-/**
- * net_send_tcp_packet() - Transmit TCP packet.
- * @payload_len: length of payload
- * @dport: Destination TCP port
- * @sport: Source TCP port
- * @action: TCP action to be performed
- * @tcp_seq_num: TCP sequence number of this transmission
- * @tcp_ack_num: TCP stream acknolegement number
- *
- * Return: 0 on success, other value on failure
- */
-int net_send_tcp_packet(int payload_len, int dport, int sport, u8 action,
-			u32 tcp_seq_num, u32 tcp_ack_num);
-int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
-			int sport, int payload_len);
-
-/* Processes a received packet */
-void net_process_received_packet(uchar *in_packet, int len);
-
-#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
-void nc_start(void);
-int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
-	unsigned src_port, unsigned len);
-#endif
-
-static __always_inline int eth_is_on_demand_init(void)
-{
-#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
-	extern enum proto_t net_loop_last_protocol;
-
-	return net_loop_last_protocol != NETCONS;
-#else
-	return 1;
-#endif
-}
-
-static inline void eth_set_last_protocol(int protocol)
-{
-#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
-	extern enum proto_t net_loop_last_protocol;
-
-	net_loop_last_protocol = protocol;
-#endif
-}
-
-/*
- * Check if autoload is enabled. If so, use either NFS or TFTP to download
- * the boot file.
- */
-void net_auto_load(void);
-
-/*
- * The following functions are a bit ugly, but necessary to deal with
- * alignment restrictions on ARM.
- *
- * We're using inline functions, which had the smallest memory
- * footprint in our tests.
- */
-/* return IP *in network byteorder* */
-static inline struct in_addr net_read_ip(void *from)
-{
-	struct in_addr ip;
-
-	memcpy((void *)&ip, (void *)from, sizeof(ip));
-	return ip;
-}
-
-/* return ulong *in network byteorder* */
-static inline u32 net_read_u32(void *from)
-{
-	u32 l;
-
-	memcpy((void *)&l, (void *)from, sizeof(l));
-	return l;
-}
-
-/* write IP *in network byteorder* */
-static inline void net_write_ip(void *to, struct in_addr ip)
-{
-	memcpy(to, (void *)&ip, sizeof(ip));
-}
-
-/* copy IP */
-static inline void net_copy_ip(void *to, void *from)
-{
-	memcpy((void *)to, from, sizeof(struct in_addr));
-}
-
-/* copy ulong */
-static inline void net_copy_u32(void *to, void *from)
-{
-	memcpy((void *)to, (void *)from, sizeof(u32));
-}
-
-/**
- * is_zero_ethaddr - Determine if give Ethernet address is all zeros.
- * @addr: Pointer to a six-byte array containing the Ethernet address
- *
- * Return true if the address is all zeroes.
- */
-static inline int is_zero_ethaddr(const u8 *addr)
-{
-	return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
-}
-
-/**
- * is_multicast_ethaddr - Determine if the Ethernet address is a multicast.
- * @addr: Pointer to a six-byte array containing the Ethernet address
- *
- * Return true if the address is a multicast address.
- * By definition the broadcast address is also a multicast address.
- */
-static inline int is_multicast_ethaddr(const u8 *addr)
-{
-	return 0x01 & addr[0];
-}
-
-/*
- * is_broadcast_ethaddr - Determine if the Ethernet address is broadcast
- * @addr: Pointer to a six-byte array containing the Ethernet address
- *
- * Return true if the address is the broadcast address.
- */
-static inline int is_broadcast_ethaddr(const u8 *addr)
-{
-	return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
-		0xff;
-}
-
-/*
- * is_valid_ethaddr - Determine if the given Ethernet address is valid
- * @addr: Pointer to a six-byte array containing the Ethernet address
- *
- * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
- * a multicast address, and is not FF:FF:FF:FF:FF:FF.
- *
- * Return true if the address is valid.
- */
-static inline int is_valid_ethaddr(const u8 *addr)
-{
-	/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
-	 * explicitly check for it here. */
-	return !is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr);
-}
-
-/**
- * net_random_ethaddr - Generate software assigned random Ethernet address
- * @addr: Pointer to a six-byte array containing the Ethernet address
- *
- * Generate a random Ethernet address (MAC) that is not multicast
- * and has the local assigned bit set.
- */
-static inline void net_random_ethaddr(uchar *addr)
-{
-	int i;
-	unsigned int seed = get_ticks();
-
-	for (i = 0; i < 6; i++)
-		addr[i] = rand_r(&seed);
-
-	addr[0] &= 0xfe;	/* clear multicast bit */
-	addr[0] |= 0x02;	/* set local assignment bit (IEEE802) */
-}
-
-/**
- * string_to_enetaddr() - Parse a MAC address
- *
- * Convert a string MAC address
- *
- * Implemented in lib/net_utils.c (built unconditionally)
- *
- * @addr: MAC address in aa:bb:cc:dd:ee:ff format, where each part is a 2-digit
- *	hex value
- * @enetaddr: Place to put MAC address (6 bytes)
- */
-void string_to_enetaddr(const char *addr, uint8_t *enetaddr);
-
-/* Convert an IP address to a string */
-void ip_to_string(struct in_addr x, char *s);
-
-/**
- * string_to_ip() - Convert a string to ip address
- *
- * Implemented in lib/net_utils.c (built unconditionally)
- *
- * @s: Input string to parse
- * @return: in_addr struct containing the parsed IP address
- */
-struct in_addr string_to_ip(const char *s);
-
-/* Convert a VLAN id to a string */
-void vlan_to_string(ushort x, char *s);
-
-/* Convert a string to a vlan id */
-ushort string_to_vlan(const char *s);
-
-/* read a VLAN id from an environment variable */
-ushort env_get_vlan(char *);
-
-/* copy a filename (allow for "..." notation, limit length) */
-void copy_filename(char *dst, const char *src, int size);
-
-/* check if serverip is specified in filename from the command line */
-int is_serverip_in_cmd(void);
-
-/**
- * net_parse_bootfile - Parse the bootfile env var / cmd line param
- *
- * @param ipaddr - a pointer to the ipaddr to populate if included in bootfile
- * @param filename - a pointer to the string to save the filename part
- * @param max_len - The longest - 1 that the filename part can be
- *
- * return 1 if parsed, 0 if bootfile is empty
- */
-int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
-
-/**
- * update_tftp - Update firmware over TFTP (via DFU)
- *
- * This function updates board's firmware via TFTP
- *
- * @param addr - memory address where data is stored
- * @param interface - the DFU medium name - e.g. "mmc"
- * @param devstring - the DFU medium number - e.g. "1"
- *
- * Return: - 0 on success, other value on failure
- */
-int update_tftp(ulong addr, char *interface, char *devstring);
-
-/**
- * env_get_ip() - Convert an environment value to to an ip address
- *
- * @var: Environment variable to convert. The value of this variable must be
- *	in the format format a.b.c.d, where each value is a decimal number from
- *	0 to 255
- * Return: IP address, or 0 if invalid
- */
-static inline struct in_addr env_get_ip(char *var)
-{
-	return string_to_ip(env_get(var));
-}
-
-/**
- * reset_phy() - Reset the Ethernet PHY
- *
- * This should be implemented by boards if CONFIG_RESET_PHY_R is enabled
- */
-void reset_phy(void);
-
-#if CONFIG_IS_ENABLED(NET)
-/**
- * eth_set_enable_bootdevs() - Enable or disable binding of Ethernet bootdevs
- *
- * These get in the way of bootstd testing, so are normally disabled by tests.
- * This provide control of this setting. It only affects binding of Ethernet
- * devices, so if that has already happened, this flag does nothing.
- *
- * @enable: true to enable binding of bootdevs when binding new Ethernet
- * devices, false to disable it
- */
-void eth_set_enable_bootdevs(bool enable);
-#else
-static inline void eth_set_enable_bootdevs(bool enable) {}
-#endif
-
-/**
- * wget_with_dns() - runs dns host IP address resulution before wget
- *
- * @dst_addr:	destination address to download the file
- * @uri:	uri string of target file of wget
- * Return:	downloaded file size, negative if failed
- */
-int wget_with_dns(ulong dst_addr, char *uri);
-
-/**
- * wget_validate_uri() - varidate the uri
- *
- * @uri:	uri string of target file of wget
- * Return:	true if uri is valid, false if uri is invalid
- */
-bool wget_validate_uri(char *uri);
 
 #endif /* __NET_H__ */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (8 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  6:52   ` Ilias Apalodimas
  2024-10-03 15:22 ` [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev() Jerome Forissier
                   ` (21 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Sean Anderson,
	Marek Vasut

copy_filename() can be useful when NET_LWIP is enabled, therefore
move it out of net/net.c which is built only when networking choice
is NET.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 net/Makefile     |  2 ++
 net/net-common.c | 13 +++++++++++++
 net/net.c        | 12 ------------
 3 files changed, 15 insertions(+), 12 deletions(-)
 create mode 100644 net/net-common.c

diff --git a/net/Makefile b/net/Makefile
index 70eec8caf0d..a9cecee637a 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -42,3 +42,5 @@ obj-$(CONFIG_CMD_WGET) += wget.o
 CFLAGS_eth_common.o += -Wno-format-extra-args
 
 endif
+
+obj-y += net-common.o
diff --git a/net/net-common.c b/net/net-common.c
new file mode 100644
index 00000000000..a7f767d5e9c
--- /dev/null
+++ b/net/net-common.c
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+
+void copy_filename(char *dst, const char *src, int size)
+{
+	if (src && *src && (*src == '"')) {
+		++src;
+		--size;
+	}
+
+	while ((--size > 0) && src && *src && (*src != '"'))
+		*dst++ = *src++;
+	*dst = '\0';
+}
diff --git a/net/net.c b/net/net.c
index 1e0b7c85624..c1d10a77b9e 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1689,18 +1689,6 @@ void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport, int sport,
 	ip->udp_xsum = 0;
 }
 
-void copy_filename(char *dst, const char *src, int size)
-{
-	if (src && *src && (*src == '"')) {
-		++src;
-		--size;
-	}
-
-	while ((--size > 0) && src && *src && (*src != '"'))
-		*dst++ = *src++;
-	*dst = '\0';
-}
-
 int is_serverip_in_cmd(void)
 {
 	return !!strchr(net_boot_file_name, ':');
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev()
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (9 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c Jerome Forissier
@ 2024-10-03 15:22 ` Jerome Forissier
  2024-10-04  6:04   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 12/29] net-lwip: build lwIP Jerome Forissier
                   ` (20 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:22 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Masahisa Kojima, Simon Glass,
	Sean Anderson, Marek Vasut, Matthias Schiffer, Fabio Estevam,
	Michal Simek

Add a function to start a given network device, and update eth_init()
to use it.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 include/net-common.h |  1 +
 net/eth-uclass.c     | 38 +++++++++++++++++++++++++-------------
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/include/net-common.h b/include/net-common.h
index 543f528a4a4..6bc76658d9d 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -192,6 +192,7 @@ int eth_env_set_enetaddr_by_index(const char *base_name, int index,
 int usb_ether_init(void);
 
 int eth_init(void);			/* Initialize the device */
+int eth_start_udev(struct udevice *dev); /* ->start() if not already running */
 int eth_send(void *packet, int length);	   /* Send a packet */
 #if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
 int eth_receive(void *packet, int length); /* Receive a packet*/
diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index e34d7af0229..5555f82f23e 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -284,6 +284,27 @@ static int on_ethaddr(const char *name, const char *value, enum env_op op,
 }
 U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr);
 
+int eth_start_udev(struct udevice *dev)
+{
+	struct eth_device_priv *priv = dev_get_uclass_priv(dev);
+	int ret;
+
+	if (priv->running)
+		return 0;
+
+	if (!device_active(dev))
+		return -EINVAL;
+
+	ret = eth_get_ops(dev)->start(dev);
+	if (ret < 0)
+		return ret;
+
+	priv->state = ETH_STATE_ACTIVE;
+	priv->running = true;
+
+	return 0;
+}
+
 int eth_init(void)
 {
 	struct udevice *current = NULL;
@@ -328,20 +349,11 @@ int eth_init(void)
 		if (current) {
 			debug("Trying %s\n", current->name);
 
-			if (device_active(current)) {
-				ret = eth_get_ops(current)->start(current);
-				if (ret >= 0) {
-					struct eth_device_priv *priv =
-						dev_get_uclass_priv(current);
-
-					priv->state = ETH_STATE_ACTIVE;
-					priv->running = true;
-					ret = 0;
-					goto end;
-				}
-			} else {
+			ret = eth_start_udev(current);
+			if (ret < 0)
 				ret = eth_errno;
-			}
+			else
+				break;
 
 			debug("FAIL\n");
 		} else {
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 12/29] net-lwip: build lwIP
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (10 preceding siblings ...)
  2024-10-03 15:22 ` [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev() Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand Jerome Forissier
                   ` (19 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Sughosh Ganu, Sean Anderson

Build the lwIP library when NET_LWIP is enabled. The following files
are adaptation layers written specially for U-Boot:

 lib/lwip/u-boot/arch/cc.h
 lib/lwip/u-boot/arch/sys_arch.h (empty)
 lib/lwip/u-boot/limits.h (empty)
 lib/lwip/u-boot/lwipopts.h

They were initially contributed by Maxim in a previous RFC patch series.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Co-developed-by: Maxim Uvarov <muvarov@gmail.com>
Cc: Maxim Uvarov <muvarov@gmail.com>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
---
 lib/Makefile                    |   2 +
 lib/lwip/Makefile               |  55 +++++++++++
 lib/lwip/u-boot/arch/cc.h       |  45 +++++++++
 lib/lwip/u-boot/arch/sys_arch.h |   0
 lib/lwip/u-boot/limits.h        |   0
 lib/lwip/u-boot/lwipopts.h      | 157 ++++++++++++++++++++++++++++++++
 6 files changed, 259 insertions(+)
 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

diff --git a/lib/Makefile b/lib/Makefile
index d300249f57c..00bfd11002a 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -96,6 +96,8 @@ obj-$(CONFIG_LIBAVB) += libavb/
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/
 obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o
 
+obj-$(CONFIG_NET_LWIP) += lwip/
+
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16-ccitt.o
 obj-$(CONFIG_$(SPL_TPL_)HASH) += crc16-ccitt.o
diff --git a/lib/lwip/Makefile b/lib/lwip/Makefile
new file mode 100644
index 00000000000..dfcd700ca47
--- /dev/null
+++ b/lib/lwip/Makefile
@@ -0,0 +1,55 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2024 Linaro Ltd.
+
+obj-y += \
+	lwip/src/api/api_lib.o \
+	lwip/src/api/api_msg.o \
+	lwip/src/api/err.o \
+	lwip/src/api/if_api.o \
+	lwip/src/api/netbuf.o \
+	lwip/src/api/netdb.o \
+	lwip/src/api/netifapi.o \
+	lwip/src/api/sockets.o \
+	lwip/src/api/tcpip.o \
+	lwip/src/apps/http/http_client.o \
+	lwip/src/apps/tftp/tftp.o \
+	lwip/src/core/altcp_alloc.o \
+	lwip/src/core/altcp.o \
+	lwip/src/core/altcp_tcp.o \
+	lwip/src/core/def.o \
+	lwip/src/core/dns.o \
+	lwip/src/core/inet_chksum.o \
+	lwip/src/core/init.o \
+	lwip/src/core/ip.o \
+	lwip/src/core/ipv4/acd.o \
+	lwip/src/core/ipv4/autoip.o \
+	lwip/src/core/ipv4/dhcp.o \
+	lwip/src/core/ipv4/etharp.o \
+	lwip/src/core/ipv4/icmp.o \
+	lwip/src/core/ipv4/igmp.o \
+	lwip/src/core/ipv4/ip4_addr.o \
+	lwip/src/core/ipv4/ip4.o \
+	lwip/src/core/ipv4/ip4_frag.o \
+	lwip/src/core/ipv6/dhcp6.o \
+	lwip/src/core/ipv6/ethip6.o \
+	lwip/src/core/ipv6/icmp6.o \
+	lwip/src/core/ipv6/inet6.o \
+	lwip/src/core/ipv6/ip6_addr.o \
+	lwip/src/core/ipv6/ip6.o \
+	lwip/src/core/ipv6/ip6_frag.o \
+	lwip/src/core/ipv6/mld6.o \
+	lwip/src/core/ipv6/nd6.o \
+	lwip/src/core/mem.o \
+	lwip/src/core/memp.o \
+	lwip/src/core/netif.o \
+	lwip/src/core/pbuf.o \
+	lwip/src/core/raw.o \
+	lwip/src/core/stats.o \
+	lwip/src/core/sys.o \
+	lwip/src/core/tcp.o \
+	lwip/src/core/tcp_in.o \
+	lwip/src/core/tcp_out.o \
+	lwip/src/core/timeouts.o \
+	lwip/src/core/udp.o \
+	lwip/src/netif/ethernet.o
diff --git a/lib/lwip/u-boot/arch/cc.h b/lib/lwip/u-boot/arch/cc.h
new file mode 100644
index 00000000000..563d3bfa98b
--- /dev/null
+++ b/lib/lwip/u-boot/arch/cc.h
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2023 Linaro Ltd. <maxim.uvarov@linaro.org> */
+
+#ifndef LWIP_ARCH_CC_H
+#define LWIP_ARCH_CC_H
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <vsprintf.h>
+#include <rand.h>
+
+#define LWIP_ERRNO_INCLUDE <errno.h>
+
+#define LWIP_ERRNO_STDINCLUDE	1
+#define LWIP_NO_UNISTD_H 1
+#define LWIP_TIMEVAL_PRIVATE 1
+
+#ifdef CONFIG_LIB_RAND
+#define LWIP_RAND() ((u32_t)rand())
+#else
+#define LWIP_DNS_SECURE 0
+#endif
+
+/* different handling for unit test, normally not needed */
+#ifdef LWIP_NOASSERT_ON_ERROR
+#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
+						handler; }} while (0)
+#endif
+
+#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS
+
+#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion \"%s\" failed at line %d in %s\n", \
+				    x, __LINE__, __FILE__); } while (0)
+
+#define atoi(str) (int)dectoul(str, NULL)
+#define lwip_strnstr(a, b, c)  strstr(a, b)
+
+#define LWIP_ERR_T int
+#define LWIP_CONST_CAST(target_type, val) ((target_type)((uintptr_t)val))
+
+#if defined(CONFIG_SYS_BIG_ENDIAN)
+#define BYTE_ORDER BIG_ENDIAN
+#endif
+
+#endif /* LWIP_ARCH_CC_H */
diff --git a/lib/lwip/u-boot/arch/sys_arch.h b/lib/lwip/u-boot/arch/sys_arch.h
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/lib/lwip/u-boot/limits.h b/lib/lwip/u-boot/limits.h
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/lib/lwip/u-boot/lwipopts.h b/lib/lwip/u-boot/lwipopts.h
new file mode 100644
index 00000000000..9d618625fac
--- /dev/null
+++ b/lib/lwip/u-boot/lwipopts.h
@@ -0,0 +1,157 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+/* Copyright (C) 2023 Linaro Ltd. <maxim.uvarov@linaro.org> */
+
+#ifndef LWIP_UBOOT_LWIPOPTS_H
+#define LWIP_UBOOT_LWIPOPTS_H
+
+#if defined(CONFIG_LWIP_DEBUG)
+#define LWIP_DEBUG 1
+#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL
+#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON
+#define ETHARP_DEBUG                    LWIP_DBG_ON
+#define NETIF_DEBUG                     LWIP_DBG_ON
+#define PBUF_DEBUG                      LWIP_DBG_OFF
+#define API_LIB_DEBUG                   LWIP_DBG_ON
+#define API_MSG_DEBUG                   LWIP_DBG_OFF
+#define SOCKETS_DEBUG                   LWIP_DBG_OFF
+#define ICMP_DEBUG                      LWIP_DBG_OFF
+#define IGMP_DEBUG                      LWIP_DBG_OFF
+#define INET_DEBUG                      LWIP_DBG_OFF
+#define IP_DEBUG                        LWIP_DBG_ON
+#define IP_REASS_DEBUG                  LWIP_DBG_OFF
+#define RAW_DEBUG                       LWIP_DBG_OFF
+#define MEM_DEBUG                       LWIP_DBG_OFF
+#define MEMP_DEBUG                      LWIP_DBG_OFF
+#define SYS_DEBUG                       LWIP_DBG_OFF
+#define TIMERS_DEBUG                    LWIP_DBG_ON
+#define TCP_DEBUG                       LWIP_DBG_OFF
+#define TCP_INPUT_DEBUG                 LWIP_DBG_OFF
+#define TCP_FR_DEBUG                    LWIP_DBG_OFF
+#define TCP_RTO_DEBUG                   LWIP_DBG_OFF
+#define TCP_CWND_DEBUG                  LWIP_DBG_OFF
+#define TCP_WND_DEBUG                   LWIP_DBG_OFF
+#define TCP_OUTPUT_DEBUG                LWIP_DBG_OFF
+#define TCP_RST_DEBUG                   LWIP_DBG_OFF
+#define TCP_QLEN_DEBUG                  LWIP_DBG_OFF
+#define UDP_DEBUG                       LWIP_DBG_OFF
+#define TCPIP_DEBUG                     LWIP_DBG_OFF
+#define SLIP_DEBUG                      LWIP_DBG_OFF
+#define DHCP_DEBUG                      LWIP_DBG_ON
+#define AUTOIP_DEBUG                    LWIP_DBG_ON
+#define DNS_DEBUG                       LWIP_DBG_ON
+#define IP6_DEBUG                       LWIP_DBG_OFF
+#define DHCP6_DEBUG                     LWIP_DBG_OFF
+#endif
+
+#define LWIP_TESTMODE                   0
+
+#if !defined(CONFIG_LWIP_ASSERT)
+#define LWIP_NOASSERT 1
+#define LWIP_ASSERT(message, assertion)
+#endif
+
+#include "lwip/debug.h"
+
+#define SYS_LIGHTWEIGHT_PROT            0
+#define NO_SYS                          1
+
+#define LWIP_IPV4			1
+#define LWIP_IPV6			0
+
+#define MEM_ALIGNMENT                   8
+
+#define MEMP_NUM_TCP_SEG                16
+#define PBUF_POOL_SIZE                  8
+
+#define LWIP_ARP                        1
+#define ARP_TABLE_SIZE                  4
+#define ARP_QUEUEING                    1
+
+#define IP_FORWARD                      0
+#define IP_OPTIONS_ALLOWED              1
+#define IP_REASSEMBLY                   0
+#define IP_FRAG                         0
+#define IP_REASS_MAXAGE                 3
+#define IP_REASS_MAX_PBUFS              4
+#define IP_FRAG_USES_STATIC_BUF         0
+
+#define IP_DEFAULT_TTL                  255
+
+#define LWIP_ICMP                       0
+
+#if defined(CONFIG_PROT_RAW_LWIP)
+#define LWIP_RAW                        1
+#else
+#define LWIP_RAW			0
+#endif
+
+#if defined(CONFIG_PROT_DHCP_LWIP)
+#define LWIP_DHCP                       1
+#define LWIP_DHCP_BOOTP_FILE		1
+#else
+#define LWIP_DHCP			0
+#endif
+
+#define LWIP_DHCP_DOES_ACD_CHECK	0
+
+#define LWIP_AUTOIP                     0
+
+#define LWIP_SNMP                       0
+
+#define LWIP_IGMP                       0
+
+#if defined(CONFIG_PROT_DNS_LWIP)
+#define LWIP_DNS                        1
+#define DNS_TABLE_SIZE                  1
+#else
+#define LWIP_DNS                        0
+#endif
+
+#if defined(CONFIG_PROT_UDP_LWIP)
+#define LWIP_UDP                        1
+#else
+#define LWIP_UDP                        0
+#endif
+
+#if defined(CONFIG_PROT_TCP_LWIP)
+#define LWIP_TCP                        1
+#define TCP_MSS                         1460
+#define TCP_WND                         CONFIG_LWIP_TCP_WND
+#define LWIP_WND_SCALE                  1
+#define TCP_RCV_SCALE                   0x7
+#define TCP_SND_BUF                     (2 * TCP_MSS)
+#ifdef CONFIG_PROT_TCP_SACK_LWIP
+#define LWIP_TCP_SACK_OUT               1
+#endif
+#else
+#define LWIP_TCP                        0
+#endif
+
+#define LWIP_LISTEN_BACKLOG             0
+
+#define PBUF_LINK_HLEN                  14
+#define PBUF_POOL_BUFSIZE               LWIP_MEM_ALIGN_SIZE(TCP_MSS + 40 + PBUF_LINK_HLEN)
+
+#define LWIP_HAVE_LOOPIF                0
+
+#define LWIP_NETCONN                    0
+#define LWIP_DISABLE_MEMP_SANITY_CHECKS 1
+
+#define LWIP_SOCKET                     0
+#define SO_REUSE                        0
+
+#define LWIP_STATS                      0
+
+#define PPP_SUPPORT                     0
+
+#define LWIP_TCPIP_CORE_LOCKING		0
+
+#define LWIP_NETIF_LOOPBACK		0
+
+/* use malloc instead of pool */
+#define MEMP_MEM_MALLOC                 1
+#define MEMP_MEM_INIT			1
+#define MEM_LIBC_MALLOC			1
+
+#endif /* LWIP_UBOOT_LWIPOPTS_H */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (11 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 12/29] net-lwip: build lwIP Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  6:50   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode Jerome Forissier
                   ` (18 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Manoj Sai,
	Matteo Lisi, Tom Rini, Gilles Talis, Michal Simek, Marek Vasut,
	Joe Hershberger, Ramon Fried, Peng Fan, Nishanth Menon,
	Simon Glass, Sughosh Ganu, Padmarao Begari,
	Venkatesh Yadav Abbarapu, James Hilliard, Petr Zejdl,
	Mattijs Korpershoek, Heinrich Schuchardt, AKASHI Takahiro,
	Francis Laniel, Maxim Moskalets, Sean Anderson, Rasmus Villemoes,
	Artur Rojek, Janne Grunau, Neal Gompa, Yang Xiwen, Boon Khai Ng,
	Robert Marko, Philip Oberfichtner, Jonas Karlman, Masahisa Kojima

Add what it takes to enable NETDEVICES with NET_LWIP and enable DHCP as
well as the dhcp command. CMD_TFTPBOOT is selected by BOOTMETH_EFI due
to this code having an implicit dependency on do_tftpb().

Note that PXE is likely non-fonctional with NET_LWIP (or at least not
100% functional) because DHCP option 209 is not supported by the lwIP
library. Therefore, BOOTP_PXE_DHCP_OPTION cannot be enabled.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 board/engicam/imx8mp/icore_mx8mp.c            |   2 +-
 .../imx8mp_debix_model_a.c                    |   2 +-
 board/ti/am335x/board.c                       |   3 +-
 board/xilinx/common/board.c                   |   3 +-
 cmd/Kconfig                                   | 100 +++---
 cmd/Makefile                                  |   6 +-
 cmd/elf.c                                     |   2 +-
 cmd/net-lwip.c                                |  13 +
 common/board_r.c                              |   4 +-
 common/usb_kbd.c                              |   2 +-
 drivers/net/Kconfig                           |   2 +-
 include/net-common.h                          |   3 +
 include/net-legacy.h                          |   3 -
 include/net-lwip.h                            |   3 +
 lib/tiny-printf.c                             |   3 +-
 net/Makefile                                  |  14 +-
 net/lwip/Makefile                             |   5 +
 net/lwip/dhcp.c                               | 127 ++++++++
 net/lwip/eth_internal.h                       |  35 +++
 net/lwip/net-lwip.c                           | 291 ++++++++++++++++++
 net/lwip/tftp.c                               |  11 +
 21 files changed, 572 insertions(+), 62 deletions(-)
 create mode 100644 cmd/net-lwip.c
 create mode 100644 net/lwip/Makefile
 create mode 100644 net/lwip/dhcp.c
 create mode 100644 net/lwip/eth_internal.h
 create mode 100644 net/lwip/net-lwip.c
 create mode 100644 net/lwip/tftp.c

diff --git a/board/engicam/imx8mp/icore_mx8mp.c b/board/engicam/imx8mp/icore_mx8mp.c
index e2ed70caa43..bfdc447c478 100644
--- a/board/engicam/imx8mp/icore_mx8mp.c
+++ b/board/engicam/imx8mp/icore_mx8mp.c
@@ -33,7 +33,7 @@ static void setup_fec(void)
 	setbits_le32(&gpr->gpr[1], BIT(22));
 }
 
-#if CONFIG_IS_ENABLED(NET)
+#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
 int board_phy_config(struct phy_device *phydev)
 {
 	if (phydev->drv->config)
diff --git a/board/polyhex/imx8mp_debix_model_a/imx8mp_debix_model_a.c b/board/polyhex/imx8mp_debix_model_a/imx8mp_debix_model_a.c
index 112770ba493..c709d017483 100644
--- a/board/polyhex/imx8mp_debix_model_a/imx8mp_debix_model_a.c
+++ b/board/polyhex/imx8mp_debix_model_a/imx8mp_debix_model_a.c
@@ -29,7 +29,7 @@ static void setup_fec(void)
 	setbits_le32(&gpr->gpr[1], BIT(22));
 }
 
-#if CONFIG_IS_ENABLED(NET)
+#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
 int board_phy_config(struct phy_device *phydev)
 {
 	if (phydev->drv->config)
diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c
index 681002ba1da..249c9fd2e7e 100644
--- a/board/ti/am335x/board.c
+++ b/board/ti/am335x/board.c
@@ -900,7 +900,8 @@ int board_late_init(void)
 #endif
 
 /* CPSW plat */
-#if CONFIG_IS_ENABLED(NET) && !CONFIG_IS_ENABLED(OF_CONTROL)
+#if (CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)) && \
+    !CONFIG_IS_ENABLED(OF_CONTROL)
 struct cpsw_slave_data slave_data[] = {
 	{
 		.slave_reg_ofs  = CPSW_SLAVE0_OFFSET,
diff --git a/board/xilinx/common/board.c b/board/xilinx/common/board.c
index 5e5eb49ddf3..b6a2381c909 100644
--- a/board/xilinx/common/board.c
+++ b/board/xilinx/common/board.c
@@ -491,7 +491,8 @@ int board_late_init_xilinx(void)
 				ret |= env_set_by_index("uuid", id, uuid);
 			}
 
-			if (!CONFIG_IS_ENABLED(NET))
+			if (!(CONFIG_IS_ENABLED(NET) ||
+			      CONFIG_IS_ENABLED(NET_LWIP)))
 				continue;
 
 			for (i = 0; i < EEPROM_HDR_NO_OF_MAC_ADDR; i++) {
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 3beddd72583..d09c237a52f 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1798,12 +1798,16 @@ config CMD_AB_SELECT
 
 endmenu
 
-if NET
+if NET || NET_LWIP
 
 menuconfig CMD_NET
 	bool "Network commands"
 	default y
 
+endif
+
+if NET
+
 if CMD_NET
 
 config CMD_BOOTP
@@ -1812,12 +1816,6 @@ config CMD_BOOTP
 	help
 	  bootp - boot image via network using BOOTP/TFTP protocol
 
-config CMD_DHCP
-	bool "dhcp"
-	depends on CMD_BOOTP
-	help
-	  Boot image via network using DHCP/TFTP protocol
-
 config CMD_DHCP6
 	bool "dhcp6"
 	depends on IPV6
@@ -1961,12 +1959,6 @@ config BOOTP_VCI_STRING
 	default "U-Boot.arm" if ARM
 	default "U-Boot"
 
-config CMD_TFTPBOOT
-	bool "tftpboot"
-	default y
-	help
-	  tftpboot - load file via network using TFTP protocol
-
 config CMD_TFTPPUT
 	bool "tftp put"
 	depends on CMD_TFTPBOOT
@@ -2026,29 +2018,6 @@ config CMD_WGET
 	  wget is a simple command to download kernel, or other files,
 	  from a http server over TCP.
 
-config CMD_MII
-	bool "mii"
-	imply CMD_MDIO
-	help
-	  If set, allows 802.3(clause 22) MII Management functions interface access
-	  The management interface specified in Clause 22 provides
-	  a simple, two signal, serial interface to connect a
-	  Station Management entity and a managed PHY for providing access
-	  to management parameters and services.
-	  The interface is referred to as the MII management interface.
-
-config MII_INIT
-	bool "Call mii_init() in the mii command"
-	depends on CMD_MII && (MPC8XX_FEC || FSLDMAFE || MCFFEC)
-
-config CMD_MDIO
-	bool "mdio"
-	depends on PHYLIB
-	help
-	  If set, allows Enable 802.3(clause 45) MDIO interface registers access
-	  The MDIO interface is orthogonal to the MII interface and extends
-	  it by adding access to more registers through indirect addressing.
-
 config CMD_PING
 	bool "ping"
 	help
@@ -2097,7 +2066,7 @@ config IPV6_ROUTER_DISCOVERY
 	help
 	  Will automatically perform router solicitation on first IPv6
 	  network operation
-endif
+endif  # if CMD_NET
 
 config CMD_ETHSW
 	bool "ethsw"
@@ -2107,6 +2076,56 @@ config CMD_ETHSW
 	  operations such as enabling / disabling a port and
 	  viewing/maintaining the filtering database (FDB)
 
+config CMD_WOL
+	bool "wol"
+	help
+	  Wait for wake-on-lan Magic Packet
+
+endif  # if NET
+
+if NET || NET_LWIP
+
+if CMD_NET
+
+config CMD_DHCP
+	bool "dhcp"
+	select PROT_DHCP_LWIP if NET_LWIP
+	help
+	  Boot image via network using DHCP/TFTP protocol
+
+config CMD_MII
+	bool "mii"
+	imply CMD_MDIO
+	help
+	  If set, allows 802.3(clause 22) MII Management functions interface access
+	  The management interface specified in Clause 22 provides
+	  a simple, two signal, serial interface to connect a
+	  Station Management entity and a managed PHY for providing access
+	  to management parameters and services.
+	  The interface is referred to as the MII management interface.
+
+config MII_INIT
+	bool "Call mii_init() in the mii command"
+	depends on CMD_MII && (MPC8XX_FEC || FSLDMAFE || MCFFEC)
+
+config CMD_MDIO
+	bool "mdio"
+	depends on PHYLIB
+	help
+	  If set, allows Enable 802.3(clause 45) MDIO interface registers access
+	  The MDIO interface is orthogonal to the MII interface and extends
+	  it by adding access to more registers through indirect addressing.
+
+config CMD_TFTPBOOT
+	bool "tftp"
+	select PROT_UDP_LWIP if NET_LWIP
+	default n
+	help
+	  tftpboot - load file via network using TFTP protocol
+	  Currently a placeholder (not implemented) when NET_LWIP=y.
+
+endif  # if CMD_NET
+
 config CMD_PXE
 	bool "pxe"
 	select PXE_UTILS
@@ -2114,12 +2133,7 @@ config CMD_PXE
 	help
 	  Boot image via network using PXE protocol
 
-config CMD_WOL
-	bool "wol"
-	help
-	  Wait for wake-on-lan Magic Packet
-
-endif
+endif  # if NET || NET_LWIP
 
 menu "Misc commands"
 
diff --git a/cmd/Makefile b/cmd/Makefile
index 91227f1249c..1c8cc42503d 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -127,7 +127,11 @@ obj-y += legacy-mtd-utils.o
 endif
 obj-$(CONFIG_CMD_MUX) += mux.o
 obj-$(CONFIG_CMD_NAND) += nand.o
-obj-$(CONFIG_CMD_NET) += net.o
+ifdef CONFIG_CMD_NET
+obj-$(CONFIG_NET) += net.o
+obj-$(CONFIG_NET_LWIP) += net-lwip.o
+CFLAGS_net-lwip.o := -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
+endif
 obj-$(CONFIG_ENV_SUPPORT) += nvedit.o
 obj-$(CONFIG_CMD_NVEDIT_EFI) += nvedit_efi.o
 obj-$(CONFIG_CMD_ONENAND) += onenand.o
diff --git a/cmd/elf.c b/cmd/elf.c
index f07e344a596..e4c68744d5f 100644
--- a/cmd/elf.c
+++ b/cmd/elf.c
@@ -130,7 +130,7 @@ int do_bootvx(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 	else
 		addr = hextoul(argv[1], NULL);
 
-#if defined(CONFIG_CMD_NET)
+#if defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_LWIP)
 	/*
 	 * Check to see if we need to tftp the image ourselves
 	 * before starting
diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
new file mode 100644
index 00000000000..82edb5fd2e6
--- /dev/null
+++ b/cmd/net-lwip.c
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <net.h>
+
+#if defined(CONFIG_CMD_DHCP)
+U_BOOT_CMD(
+        dhcp,   3,      1,      do_dhcp,
+        "boot image via network using DHCP/TFTP protocol",
+        "[loadAddress] [[hostIPaddr:]bootfilename]"
+);
+#endif
diff --git a/common/board_r.c b/common/board_r.c
index 4faaa202421..49347370a1f 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -472,7 +472,7 @@ static int initr_status_led(void)
 }
 #endif
 
-#ifdef CONFIG_CMD_NET
+#if defined(CONFIG_CMD_NET)
 static int initr_net(void)
 {
 	puts("Net:   ");
@@ -738,7 +738,7 @@ static init_fnc_t init_sequence_r[] = {
 #ifdef CONFIG_PCI_ENDPOINT
 	pci_ep_init,
 #endif
-#ifdef CONFIG_CMD_NET
+#if defined(CONFIG_CMD_NET)
 	INIT_FUNC_WATCHDOG_RESET
 	initr_net,
 #endif
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index bbfee23bc26..36107a3b278 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -423,7 +423,7 @@ static int usb_kbd_testc(struct stdio_dev *sdev)
 	 */
 	unsigned long poll_delay = CONFIG_SYS_HZ / 50;
 
-#ifdef CONFIG_CMD_NET
+#if defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_LWIP)
 	/*
 	 * If net_busy_flag is 1, NET transfer is running,
 	 * then we check key-pressed every second (first check may be
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 9c042808b44..25084b4103d 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -97,7 +97,7 @@ config DSA_SANDBOX
 
 menuconfig NETDEVICES
 	bool "Network device support"
-	depends on NET
+	depends on NET || NET_LWIP
 	select DM_ETH
 	help
 	  You must select Y to enable any network device support
diff --git a/include/net-common.h b/include/net-common.h
index 6bc76658d9d..cbcac178c82 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -118,6 +118,9 @@ extern int		net_restart_wrap;	/* Tried all network devices */
 extern uchar               *net_rx_packets[PKTBUFSRX]; /* Receive packets */
 extern const u8		net_bcast_ethaddr[ARP_HLEN];	/* Ethernet broadcast address */
 extern char	net_boot_file_name[1024];/* Boot File name */
+extern struct in_addr	net_ip;		/* Our    IP addr (0 = unknown) */
+/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
+extern char *pxelinux_configfile;
 
 /**
  * compute_ip_checksum() - Compute IP checksum
diff --git a/include/net-legacy.h b/include/net-legacy.h
index 19c991e12f6..bdca904a0f8 100644
--- a/include/net-legacy.h
+++ b/include/net-legacy.h
@@ -285,12 +285,9 @@ extern char	net_hostname[32];	/* Our hostname */
 #ifdef CONFIG_NET
 extern char	net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN];	/* Our root path */
 #endif
-/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
-extern char *pxelinux_configfile;
 /** END OF BOOTP EXTENTIONS **/
 extern u8		net_ethaddr[ARP_HLEN];		/* Our ethernet address */
 extern u8		net_server_ethaddr[ARP_HLEN];	/* Boot server enet address */
-extern struct in_addr	net_ip;		/* Our    IP addr (0 = unknown) */
 extern struct in_addr	net_server_ip;	/* Server IP addr (0 = unknown) */
 extern uchar		*net_tx_packet;		/* THE transmit packet */
 extern uchar		*net_rx_packets[PKTBUFSRX]; /* Receive packets */
diff --git a/include/net-lwip.h b/include/net-lwip.h
index 5c3f9e7e86c..cfd06726577 100644
--- a/include/net-lwip.h
+++ b/include/net-lwip.h
@@ -10,5 +10,8 @@ struct netif *net_lwip_new_netif(struct udevice *udev);
 struct netif *net_lwip_new_netif_noip(struct udevice *udev);
 void net_lwip_remove_netif(struct netif *netif);
 struct netif *net_lwip_get_netif(void);
+int net_lwip_rx(struct udevice *udev, struct netif *netif);
+
+int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 
 #endif /* __NET_LWIP_H__ */
diff --git a/lib/tiny-printf.c b/lib/tiny-printf.c
index 9a70c6095b3..f6727360097 100644
--- a/lib/tiny-printf.c
+++ b/lib/tiny-printf.c
@@ -269,7 +269,8 @@ static int _vprintf(struct printf_info *info, const char *fmt, va_list va)
 				}
 				break;
 			case 'p':
-				if (CONFIG_IS_ENABLED(NET) || _DEBUG) {
+				if (CONFIG_IS_ENABLED(NET) ||
+				    CONFIG_IS_ENABLED(NET_LWIP) || _DEBUG) {
 					pointer(info, fmt, va_arg(va, void *));
 					/*
 					 * Skip this because it pulls in _ctype which is
diff --git a/net/Makefile b/net/Makefile
index a9cecee637a..68370595a8e 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -12,11 +12,6 @@ obj-$(CONFIG_CMD_BOOTP) += bootp.o
 obj-$(CONFIG_CMD_CDP)  += cdp.o
 obj-$(CONFIG_CMD_DNS)  += dns.o
 obj-$(CONFIG_DM_DSA)   += dsa-uclass.o
-obj-$(CONFIG_$(SPL_)DM_ETH) += eth-uclass.o
-obj-$(CONFIG_$(SPL_TPL_)BOOTDEV_ETH) += eth_bootdev.o
-obj-$(CONFIG_DM_MDIO)  += mdio-uclass.o
-obj-$(CONFIG_DM_MDIO_MUX) += mdio-mux-uclass.o
-obj-$(CONFIG_$(SPL_)DM_ETH) += eth_common.o
 obj-$(CONFIG_CMD_LINK_LOCAL) += link_local.o
 obj-$(CONFIG_IPV6)     += ndisc.o
 obj-$(CONFIG_$(SPL_)DM_ETH) += net.o
@@ -43,4 +38,13 @@ CFLAGS_eth_common.o += -Wno-format-extra-args
 
 endif
 
+ifeq ($(filter y,$(CONFIG_NET) $(CONFIG_NET_LWIP)),y)
+obj-$(CONFIG_$(SPL_TPL_)BOOTDEV_ETH) += eth_bootdev.o
+obj-$(CONFIG_DM_MDIO)  += mdio-uclass.o
+obj-$(CONFIG_DM_MDIO_MUX) += mdio-mux-uclass.o
+obj-$(CONFIG_$(SPL_)DM_ETH) += eth-uclass.o
+obj-$(CONFIG_$(SPL_)DM_ETH) += eth_common.o
 obj-y += net-common.o
+endif
+
+obj-$(CONFIG_NET_LWIP) += lwip/
diff --git a/net/lwip/Makefile b/net/lwip/Makefile
new file mode 100644
index 00000000000..4e92a101ddb
--- /dev/null
+++ b/net/lwip/Makefile
@@ -0,0 +1,5 @@
+ccflags-y += -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
+
+obj-$(CONFIG_$(SPL_)DM_ETH) += net-lwip.o
+obj-$(CONFIG_CMD_DHCP) += dhcp.o
+obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
new file mode 100644
index 00000000000..be458d554cb
--- /dev/null
+++ b/net/lwip/dhcp.c
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <console.h>
+#include <dm/device.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <lwip/dhcp.h>
+#include <lwip/dns.h>
+#include <lwip/timeouts.h>
+#include <net.h>
+#include <time.h>
+
+#define DHCP_TIMEOUT_MS 10000
+
+#ifdef CONFIG_CMD_TFTPBOOT
+/* Boot file obtained from DHCP (if present) */
+static char boot_file_name[DHCP_BOOT_FILE_LEN];
+#endif
+
+static void call_lwip_dhcp_fine_tmr(void *ctx)
+{
+	dhcp_fine_tmr();
+	sys_timeout(10, call_lwip_dhcp_fine_tmr, NULL);
+}
+
+static int dhcp_loop(struct udevice *udev)
+{
+	char *ipstr = "ipaddr\0\0";
+	char *maskstr = "netmask\0\0";
+	char *gwstr = "gatewayip\0\0";
+	unsigned long start;
+	struct netif *netif;
+	struct dhcp *dhcp;
+	bool bound;
+	int idx;
+
+	idx = dev_seq(udev);
+	if (idx < 0 || idx > 99) {
+		log_err("unexpected idx %d\n", idx);
+		return CMD_RET_FAILURE;
+	}
+
+	netif = net_lwip_new_netif_noip(udev);
+	if (!netif)
+		return CMD_RET_FAILURE;
+
+	start = get_timer(0);
+	dhcp_start(netif);
+	call_lwip_dhcp_fine_tmr(NULL);
+
+	/* Wait for DHCP to complete */
+	do {
+		net_lwip_rx(udev, netif);
+		sys_check_timeouts();
+		bound = dhcp_supplied_address(netif);
+		if (bound)
+			break;
+		if (ctrlc()) {
+			printf("Abort\n");
+			break;
+		}
+		mdelay(1);
+	} while (get_timer(start) < DHCP_TIMEOUT_MS);
+
+	sys_untimeout(call_lwip_dhcp_fine_tmr, NULL);
+
+	if (!bound) {
+		net_lwip_remove_netif(netif);
+		return CMD_RET_FAILURE;
+	}
+
+	dhcp = netif_dhcp_data(netif);
+
+	env_set("bootfile", dhcp->boot_file_name);
+
+	if (idx > 0) {
+		sprintf(ipstr, "ipaddr%d", idx);
+		sprintf(maskstr, "netmask%d", idx);
+		sprintf(gwstr, "gatewayip%d", idx);
+	} else {
+		net_ip.s_addr = dhcp->offered_ip_addr.addr;
+	}
+
+	env_set(ipstr, ip4addr_ntoa(&dhcp->offered_ip_addr));
+	env_set(maskstr, ip4addr_ntoa(&dhcp->offered_sn_mask));
+	env_set("serverip", ip4addr_ntoa(&dhcp->server_ip_addr));
+	if (dhcp->offered_gw_addr.addr != 0)
+		env_set(gwstr, ip4addr_ntoa(&dhcp->offered_gw_addr));
+
+#ifdef CONFIG_PROT_DNS_LWIP
+	env_set("dnsip", ip4addr_ntoa(dns_getserver(0)));
+	env_set("dnsip2", ip4addr_ntoa(dns_getserver(1)));
+#endif
+#ifdef CONFIG_CMD_TFTPBOOT
+	if (dhcp->boot_file_name[0] != '\0')
+		strncpy(boot_file_name, dhcp->boot_file_name,
+			sizeof(boot_file_name));
+#endif
+
+	printf("DHCP client bound to address %pI4 (%lu ms)\n",
+	       &dhcp->offered_ip_addr, get_timer(start));
+
+	net_lwip_remove_netif(netif);
+	return CMD_RET_SUCCESS;
+}
+
+int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	eth_set_current();
+
+	return dhcp_loop(eth_get_dev());
+}
+
+int dhcp_run(ulong addr, const char *fname, bool autoload)
+{
+	char *dhcp_argv[] = {"dhcp", NULL, };
+	struct cmd_tbl cmdtp = {};	/* dummy */
+
+	if (autoload) {
+		/* Will be supported when TFTP is added */
+		return -EOPNOTSUPP;
+	}
+
+	return do_dhcp(&cmdtp, 0, 1, dhcp_argv);
+}
diff --git a/net/lwip/eth_internal.h b/net/lwip/eth_internal.h
new file mode 100644
index 00000000000..0b829a8d388
--- /dev/null
+++ b/net/lwip/eth_internal.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2001-2015
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ * Joe Hershberger, National Instruments
+ */
+
+#ifndef __ETH_INTERNAL_H
+#define __ETH_INTERNAL_H
+
+/* Do init that is common to driver model and legacy networking */
+void eth_common_init(void);
+
+/**
+ * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
+ *
+ * This sets up an environment variable with the given MAC address (@enetaddr).
+ * The environment variable to be set is defined by <@base_name><@index>addr.
+ * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
+ * eth1addr, etc.
+ *
+ * @base_name:	Base name for variable, typically "eth"
+ * @index:	Index of interface being updated (>=0)
+ * @enetaddr:	Pointer to MAC address to put into the variable
+ * Return: 0 if OK, other value on error
+ */
+int eth_env_set_enetaddr_by_index(const char *base_name, int index,
+				 uchar *enetaddr);
+
+int eth_mac_skip(int index);
+void eth_current_changed(void);
+void eth_set_dev(struct udevice *dev);
+void eth_set_current_to_next(void);
+
+#endif
diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c
new file mode 100644
index 00000000000..ca5426d058b
--- /dev/null
+++ b/net/lwip/net-lwip.c
@@ -0,0 +1,291 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <dm/device.h>
+#include <dm/uclass.h>
+#include <lwip/ip4_addr.h>
+#include <lwip/err.h>
+#include <lwip/netif.h>
+#include <lwip/pbuf.h>
+#include <lwip/etharp.h>
+#include <lwip/init.h>
+#include <lwip/prot/etharp.h>
+#include <net.h>
+
+/* xx:xx:xx:xx:xx:xx\0 */
+#define MAC_ADDR_STRLEN 18
+
+#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
+void (*push_packet)(void *, int len) = 0;
+#endif
+int net_restart_wrap;
+static uchar net_pkt_buf[(PKTBUFSRX) * PKTSIZE_ALIGN + PKTALIGN];
+uchar *net_rx_packets[PKTBUFSRX];
+uchar *net_rx_packet;
+const u8 net_bcast_ethaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+char *pxelinux_configfile;
+/* Our IP addr (0 = unknown) */
+struct in_addr	net_ip;
+
+static err_t linkoutput(struct netif *netif, struct pbuf *p)
+{
+	struct udevice *udev = netif->state;
+	void *pp = NULL;
+	int err;
+
+	if ((unsigned long)p->payload % PKTALIGN) {
+		/*
+		 * Some net drivers have strict alignment requirements and may
+		 * fail or output invalid data if the packet is not aligned.
+		 */
+		pp = memalign(PKTALIGN, p->len);
+		if (!pp)
+			return ERR_ABRT;
+		memcpy(pp, p->payload, p->len);
+	}
+
+	err = eth_get_ops(udev)->send(udev, pp ? pp : p->payload, p->len);
+	free(pp);
+	if (err) {
+		log_err("send error %d\n", err);
+		return ERR_ABRT;
+	}
+
+	return ERR_OK;
+}
+
+static err_t net_lwip_if_init(struct netif *netif)
+{
+#if LWIP_IPV4
+	netif->output = etharp_output;
+#endif
+	netif->linkoutput = linkoutput;
+	netif->mtu = 1500;
+	netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
+
+	return ERR_OK;
+}
+
+static void eth_init_rings(void)
+{
+	int i;
+
+	for (i = 0; i < PKTBUFSRX; i++)
+		net_rx_packets[i] = net_pkt_buf + i  * PKTSIZE_ALIGN;
+}
+
+struct netif *net_lwip_get_netif(void)
+{
+	struct netif *netif, *found = NULL;
+
+	NETIF_FOREACH(netif) {
+		if (!found)
+			found = netif;
+		else
+			printf("Error: more than one netif in lwIP\n");
+	}
+	return found;
+}
+
+static int get_udev_ipv4_info(struct udevice *dev, ip4_addr_t *ip,
+			      ip4_addr_t *mask, ip4_addr_t *gw)
+{
+	char *ipstr = "ipaddr\0\0";
+	char *maskstr = "netmask\0\0";
+	char *gwstr = "gatewayip\0\0";
+	int idx = dev_seq(dev);
+	char *env;
+
+	if (idx < 0 || idx > 99) {
+		log_err("unexpected idx %d\n", idx);
+		return -1;
+	}
+
+	if (idx) {
+		sprintf(ipstr, "ipaddr%d", idx);
+		sprintf(maskstr, "netmask%d", idx);
+		sprintf(gwstr, "gatewayip%d", idx);
+	}
+
+	ip4_addr_set_zero(ip);
+	ip4_addr_set_zero(mask);
+	ip4_addr_set_zero(gw);
+
+	env = env_get(ipstr);
+	if (env)
+		ip4addr_aton(env, ip);
+
+	env = env_get(maskstr);
+	if (env)
+		ip4addr_aton(env, mask);
+
+	env = env_get(gwstr);
+	if (env)
+		ip4addr_aton(env, gw);
+
+	return 0;
+}
+
+static struct netif *new_netif(struct udevice *udev, bool with_ip)
+{
+	unsigned char enetaddr[ARP_HLEN];
+	char hwstr[MAC_ADDR_STRLEN];
+	ip4_addr_t ip, mask, gw;
+	struct netif *netif;
+	int ret = 0;
+	static bool first_call = true;
+
+	if (!udev)
+		return NULL;
+
+	if (first_call) {
+		eth_init_rings();
+		/* Pick a valid active device, if any */
+		eth_init();
+		lwip_init();
+		first_call = false;
+	}
+
+	if (eth_start_udev(udev) < 0) {
+		log_err("Could not start %s\n", udev->name);
+		return NULL;
+	}
+
+	netif_remove(net_lwip_get_netif());
+
+	ip4_addr_set_zero(&ip);
+	ip4_addr_set_zero(&mask);
+	ip4_addr_set_zero(&gw);
+
+	if (with_ip)
+		if (get_udev_ipv4_info(udev, &ip, &mask, &gw) < 0)
+			return NULL;
+
+	eth_env_get_enetaddr_by_index("eth", dev_seq(udev), enetaddr);
+	ret = snprintf(hwstr, MAC_ADDR_STRLEN, "%pM",  enetaddr);
+	if (ret < 0 || ret >= MAC_ADDR_STRLEN)
+		return NULL;
+
+	netif = calloc(1, sizeof(struct netif));
+	if (!netif)
+		return NULL;
+
+	netif->name[0] = 'e';
+	netif->name[1] = 't';
+
+	string_to_enetaddr(hwstr, netif->hwaddr);
+	netif->hwaddr_len = ETHARP_HWADDR_LEN;
+	debug("adding lwIP netif for %s with hwaddr:%s ip:%s ", udev->name,
+	      hwstr, ip4addr_ntoa(&ip));
+	debug("mask:%s ", ip4addr_ntoa(&mask));
+	debug("gw:%s\n", ip4addr_ntoa(&gw));
+
+	if (!netif_add(netif, &ip, &mask, &gw, udev, net_lwip_if_init,
+		       netif_input)) {
+		printf("error: netif_add() failed\n");
+		free(netif);
+		return NULL;
+	}
+
+	netif_set_up(netif);
+	netif_set_link_up(netif);
+	/* Routing: use this interface to reach the default gateway */
+	netif_set_default(netif);
+
+	return netif;
+}
+
+struct netif *net_lwip_new_netif(struct udevice *udev)
+{
+	return new_netif(udev, true);
+}
+
+struct netif *net_lwip_new_netif_noip(struct udevice *udev)
+{
+
+	return new_netif(udev, false);
+}
+
+void net_lwip_remove_netif(struct netif *netif)
+{
+	netif_remove(netif);
+	free(netif);
+}
+
+int net_init(void)
+{
+	eth_set_current();
+
+	net_lwip_new_netif(eth_get_dev());
+
+	return 0;
+}
+
+static struct pbuf *alloc_pbuf_and_copy(uchar *data, int len)
+{
+        struct pbuf *p, *q;
+
+        /* We allocate a pbuf chain of pbufs from the pool. */
+        p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
+        if (!p) {
+                LINK_STATS_INC(link.memerr);
+                LINK_STATS_INC(link.drop);
+                return NULL;
+        }
+
+        for (q = p; q != NULL; q = q->next) {
+                memcpy(q->payload, data, q->len);
+                data += q->len;
+        }
+
+        LINK_STATS_INC(link.recv);
+
+        return p;
+}
+
+int net_lwip_rx(struct udevice *udev, struct netif *netif)
+{
+	struct pbuf *pbuf;
+	uchar *packet;
+	int flags;
+	int len;
+	int i;
+
+	if (!eth_is_active(udev))
+		return -EINVAL;
+
+	flags = ETH_RECV_CHECK_DEVICE;
+	for (i = 0; i < ETH_PACKETS_BATCH_RECV; i++) {
+		len = eth_get_ops(udev)->recv(udev, flags, &packet);
+		flags = 0;
+
+		if (len > 0) {
+			pbuf = alloc_pbuf_and_copy(packet, len);
+			if (pbuf)
+				netif->input(pbuf, netif);
+		}
+		if (len >= 0 && eth_get_ops(udev)->free_pkt)
+			eth_get_ops(udev)->free_pkt(udev, packet, len);
+		if (len <= 0)
+			break;
+	}
+	if (len == -EAGAIN)
+		len = 0;
+
+	return len;
+}
+
+void net_process_received_packet(uchar *in_packet, int len)
+{
+#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
+	if (push_packet)
+		(*push_packet)(in_packet, len);
+#endif
+}
+
+u32_t sys_now(void)
+{
+	return get_timer(0);
+}
diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c
new file mode 100644
index 00000000000..1fa246f55d9
--- /dev/null
+++ b/net/lwip/tftp.c
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <net-lwip.h>
+
+int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	/* Not implemented */
+	return CMD_RET_FAILURE;
+}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (12 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  6:11   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command Jerome Forissier
                   ` (17 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini

The TFTP app should not bind to the TFTP server port when configured as
a client. Instead, the local port should be chosen from the dynamic
range (49152 ~ 65535) so that if the application is stopped and started
again, the remote server will not consider the new packets as part of
the same context (which would cause an error since a new RRQ would be
unexpected).

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 lib/lwip/lwip/src/apps/tftp/tftp.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
index ddfdbfc0c1b..74fc1fbe586 100644
--- a/lib/lwip/lwip/src/apps/tftp/tftp.c
+++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
@@ -454,10 +454,12 @@ tftp_init_common(u8_t mode, const struct tftp_context *ctx)
     return ERR_MEM;
   }
 
-  ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
-  if (ret != ERR_OK) {
-    udp_remove(pcb);
-    return ret;
+  if (mode == LWIP_TFTP_MODE_SERVER) {
+    ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
+    if (ret != ERR_OK) {
+      udp_remove(pcb);
+      return ret;
+    }
   }
 
   tftp_state.handle    = NULL;
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (13 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04 12:02   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 16/29] net-lwip: add ping command Jerome Forissier
                   ` (16 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Masahisa Kojima,
	Marek Vasut, Sean Anderson

Implement do_tftpb(). This implementation of the tftp command
supports an optional port number. For example:

 tftp 192.168.0.30:9069:file.bin

It also supports taking the server IP from ${tftpserverip} if
defined, before falling back to ${serverip}.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 cmd/Kconfig          |   3 +-
 cmd/net-lwip.c       |   8 ++
 include/net-common.h |   4 +
 include/net-lwip.h   |   4 +
 lib/binman.c         |   1 +
 net/lwip/dhcp.c      |  11 +-
 net/lwip/net-lwip.c  |  16 +++
 net/lwip/tftp.c      | 283 ++++++++++++++++++++++++++++++++++++++++++-
 8 files changed, 324 insertions(+), 6 deletions(-)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index d09c237a52f..f1372a025b7 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2119,10 +2119,9 @@ config CMD_MDIO
 config CMD_TFTPBOOT
 	bool "tftp"
 	select PROT_UDP_LWIP if NET_LWIP
-	default n
+	default y
 	help
 	  tftpboot - load file via network using TFTP protocol
-	  Currently a placeholder (not implemented) when NET_LWIP=y.
 
 endif  # if CMD_NET
 
diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
index 82edb5fd2e6..80f0872bb8f 100644
--- a/cmd/net-lwip.c
+++ b/cmd/net-lwip.c
@@ -11,3 +11,11 @@ U_BOOT_CMD(
         "[loadAddress] [[hostIPaddr:]bootfilename]"
 );
 #endif
+
+#if defined(CONFIG_CMD_TFTPBOOT)
+U_BOOT_CMD(
+	tftpboot,	3,	0,	do_tftpb,
+	"boot image via network using TFTP protocol\n",
+	"[loadAddress] [[hostIPaddr:]bootfilename]"
+);
+#endif
diff --git a/include/net-common.h b/include/net-common.h
index cbcac178c82..fd7c5e7b488 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -459,6 +459,10 @@ static inline struct in_addr env_get_ip(char *var)
 
 int net_init(void);
 
+/* NET compatibility */
+enum proto_t;
+int net_loop(enum proto_t protocol);
+
 /**
  * dhcp_run() - Run DHCP on the current ethernet device
  *
diff --git a/include/net-lwip.h b/include/net-lwip.h
index cfd06726577..37744b0e2cd 100644
--- a/include/net-lwip.h
+++ b/include/net-lwip.h
@@ -6,6 +6,10 @@
 #include <lwip/ip4.h>
 #include <lwip/netif.h>
 
+enum proto_t {
+	TFTPGET
+};
+
 struct netif *net_lwip_new_netif(struct udevice *udev);
 struct netif *net_lwip_new_netif_noip(struct udevice *udev);
 void net_lwip_remove_netif(struct netif *netif);
diff --git a/lib/binman.c b/lib/binman.c
index 9047f5275f3..93d85548116 100644
--- a/lib/binman.c
+++ b/lib/binman.c
@@ -137,6 +137,7 @@ int binman_init(void)
 {
 	int ret;
 
+	return 0;
 	binman = malloc(sizeof(struct binman_info));
 	if (!binman)
 		return log_msg_ret("space for binman", -ENOMEM);
diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
index be458d554cb..14685cf7825 100644
--- a/net/lwip/dhcp.c
+++ b/net/lwip/dhcp.c
@@ -116,11 +116,20 @@ int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 int dhcp_run(ulong addr, const char *fname, bool autoload)
 {
 	char *dhcp_argv[] = {"dhcp", NULL, };
+#ifdef CONFIG_CMD_TFTPBOOT
+	char *tftp_argv[] = {"tftpboot", boot_file_name, NULL, };
+#endif
 	struct cmd_tbl cmdtp = {};	/* dummy */
 
 	if (autoload) {
-		/* Will be supported when TFTP is added */
+#ifdef CONFIG_CMD_TFTPBOOT
+		/* Assume DHCP was already performed */
+		if (boot_file_name[0])
+			return do_tftpb(&cmdtp, 0, 2, tftp_argv);
+		return 0;
+#else
 		return -EOPNOTSUPP;
+#endif
 	}
 
 	return do_dhcp(&cmdtp, 0, 1, dhcp_argv);
diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c
index ca5426d058b..6a27d71de73 100644
--- a/net/lwip/net-lwip.c
+++ b/net/lwip/net-lwip.c
@@ -28,6 +28,7 @@ const u8 net_bcast_ethaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 char *pxelinux_configfile;
 /* Our IP addr (0 = unknown) */
 struct in_addr	net_ip;
+char net_boot_file_name[1024];
 
 static err_t linkoutput(struct netif *netif, struct pbuf *p)
 {
@@ -285,6 +286,21 @@ void net_process_received_packet(uchar *in_packet, int len)
 #endif
 }
 
+int net_loop(enum proto_t protocol)
+{
+	char *argv[1];
+
+	switch (protocol) {
+	case TFTPGET:
+		argv[0] = "tftpboot";
+		return do_tftpb(NULL, 0, 1, argv);
+	default:
+		return -EINVAL;
+	}
+
+	return -EINVAL;
+}
+
 u32_t sys_now(void)
 {
 	return get_timer(0);
diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c
index 1fa246f55d9..26978643313 100644
--- a/net/lwip/tftp.c
+++ b/net/lwip/tftp.c
@@ -2,10 +2,287 @@
 /* Copyright (C) 2024 Linaro Ltd. */
 
 #include <command.h>
-#include <net-lwip.h>
+#include <console.h>
+#include <display_options.h>
+#include <dm/device.h>
+#include <efi_loader.h>
+#include <image.h>
+#include <linux/delay.h>
+#include <lwip/apps/tftp_client.h>
+#include <lwip/timeouts.h>
+#include <mapmem.h>
+#include <net.h>
+#include <time.h>
+
+#define PROGRESS_PRINT_STEP_BYTES (10 * 1024)
+
+enum done_state {
+	NOT_DONE = 0,
+	SUCCESS,
+	FAILURE,
+	ABORTED
+};
+
+struct tftp_ctx {
+	ulong daddr;
+	ulong size;
+	ulong block_count;
+	ulong start_time;
+	enum done_state done;
+};
+
+static void *tftp_open(const char *fname, const char *mode, u8_t is_write)
+{
+	return NULL;
+}
+
+static void tftp_close(void *handle)
+{
+	struct tftp_ctx *ctx = handle;
+	ulong elapsed;
+
+	if (ctx->done == FAILURE || ctx->done == ABORTED) {
+		/* Closing after an error or Ctrl-C */
+		return;
+	}
+	ctx->done = SUCCESS;
+
+	elapsed = get_timer(ctx->start_time);
+	if (elapsed > 0) {
+		puts("\n\t ");	/* Line up with "Loading: " */
+		print_size(ctx->size / elapsed * 1000, "/s");
+	}
+	puts("\ndone\n");
+	printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
+
+	if (env_set_hex("filesize", ctx->size)) {
+		log_err("filesize not updated\n");
+		return;
+	}
+}
+
+static int tftp_read(void *handle, void *buf, int bytes)
+{
+	return 0;
+}
+
+static int tftp_write(void *handle, struct pbuf *p)
+{
+	struct tftp_ctx *ctx = handle;
+	struct pbuf *q;
+
+	for (q = p; q != NULL; q = q->next) {
+		memcpy((void *)ctx->daddr, q->payload, q->len);
+		ctx->daddr += q->len;
+		ctx->size += q->len;
+		ctx->block_count++;
+		if (ctx->block_count % 10 == 0) {
+			putc('#');
+			if (ctx->block_count % (65 * 10) == 0)
+				puts("\n\t ");
+		}
+	}
+
+	return 0;
+}
+
+static void tftp_error(void *handle, int err, const char *msg, int size)
+{
+	struct tftp_ctx *ctx = handle;
+	char message[100];
+
+	ctx->done = FAILURE;
+	memset(message, 0, sizeof(message));
+	memcpy(message, msg, LWIP_MIN(sizeof(message) - 1, (size_t)size));
+
+	printf("\nTFTP error: %d (%s)\n", err, message);
+}
+
+static const struct tftp_context tftp_context = {
+	tftp_open,
+	tftp_close,
+	tftp_read,
+	tftp_write,
+	tftp_error
+};
+
+static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
+		     ip_addr_t srvip, uint16_t srvport)
+{
+	struct netif *netif;
+	struct tftp_ctx ctx;
+	err_t err;
+
+	if (!fname || addr == 0)
+		return -1;
+
+	if (!srvport)
+		srvport = TFTP_PORT;
+
+	netif = net_lwip_new_netif(udev);
+	if (!netif)
+		return -1;
+
+	ctx.done = NOT_DONE;
+	ctx.size = 0;
+	ctx.block_count = 0;
+	ctx.daddr = addr;
+
+	printf("Using %s device\n", udev->name);
+	printf("TFTP from server %s; our IP address is %s\n",
+		 ip4addr_ntoa(&srvip), env_get("ipaddr"));
+	printf("Filename '%s'.\n", fname);
+	printf("Load address: 0x%lx\n", ctx.daddr);
+	printf("Loading: ");
+
+	err = tftp_init_client(&tftp_context);
+	if (!(err == ERR_OK || err == ERR_USE))
+		log_err("tftp_init_client err: %d\n", err);
+
+	ctx.start_time = get_timer(0);
+	err = tftp_get(&ctx, &srvip, srvport, fname, TFTP_MODE_OCTET);
+	/* might return different errors, like routing problems */
+	if (err != ERR_OK) {
+		printf("tftp_get() error %d\n", err);
+		net_lwip_remove_netif(netif);
+		return -1;
+	}
+
+	while (!ctx.done) {
+		net_lwip_rx(udev, netif);
+		sys_check_timeouts();
+		if (ctrlc()) {
+			printf("\nAbort\n");
+			ctx.done = ABORTED;
+			break;
+		}
+	}
+
+	tftp_cleanup();
+
+	net_lwip_remove_netif(netif);
+
+	if (ctx.done == SUCCESS) {
+		if (env_set_hex("fileaddr", addr)) {
+			log_err("fileaddr not updated\n");
+			return -1;
+		}
+		efi_set_bootdev("Net", "", fname, map_sysmem(addr, 0),
+				ctx.size);
+		return 0;
+	}
+
+	return -1;
+}
 
 int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-	/* Not implemented */
-	return CMD_RET_FAILURE;
+	int ret = CMD_RET_SUCCESS;
+	char *arg = NULL;
+	char *words[3] = { };
+	char *fname = NULL;
+	char *server_ip = NULL;
+	char *server_port = NULL;
+	char *end;
+	ip_addr_t srvip;
+	uint16_t port = TFTP_PORT;
+	ulong laddr;
+	ulong addr;
+	int i;
+
+	laddr = env_get_ulong("loadaddr", 16, image_load_addr);
+
+	switch (argc) {
+	case 1:
+		fname = env_get("bootfile");
+		break;
+	case 2:
+		/*
+		 * Only one arg - accept two forms:
+		 * Just load address, or just boot file name. The latter
+		 * form must be written in a format which can not be
+		 * mis-interpreted as a valid number.
+		 */
+		addr = hextoul(argv[1], &end);
+		if (end == (argv[1] + strlen(argv[1]))) {
+			laddr = addr;
+			fname = env_get("bootfile");
+		} else {
+			arg = strdup(argv[1]);
+		}
+		break;
+	case 3:
+		laddr = hextoul(argv[1], NULL);
+		arg = strdup(argv[2]);
+		break;
+	default:
+		ret = CMD_RET_USAGE;
+		goto out;
+	}
+
+	if (!arg)
+		arg = net_boot_file_name;
+
+	if (arg) {
+		/* Parse [ip:[port:]]fname */
+		i = 0;
+		while ((*(words + i) = strsep(&arg,":")))
+			i++;
+
+		switch (i) {
+		case 3:
+			server_ip = words[0];
+			server_port = words[1];
+			fname = words[2];
+			break;
+		case 2:
+			server_ip = words[0];
+			fname = words[1];
+			break;
+		case 1:
+			fname = words[0];
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (!server_ip)
+		server_ip = env_get("tftpserverip");
+	if (!server_ip)
+		server_ip = env_get("serverip");
+	if (!server_ip) {
+		log_err("error: tftpserverip/serverip has to be set\n");
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+
+	if (server_port)
+		port = dectoul(server_port, NULL);
+
+	if (!ipaddr_aton(server_ip, &srvip)) {
+		log_err("error: ipaddr_aton\n");
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+
+	if (!fname) {
+		log_err("error: no file name\n");
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+
+	if (!laddr) {
+		log_err("error: no load address\n");
+		ret = CMD_RET_FAILURE;
+		goto out;
+	}
+
+	eth_set_current();
+
+	if (tftp_loop(eth_get_dev(), laddr, fname, srvip, port) < 0)
+		ret = CMD_RET_FAILURE;
+out:
+	free(arg);
+	return ret;
 }
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 16/29] net-lwip: add ping command
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (14 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 17/29] net-lwip: add dns command Jerome Forissier
                   ` (15 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Mattijs Korpershoek,
	Heinrich Schuchardt, AKASHI Takahiro

Add support for the the ping command with NET_LWIP. The implementation
is derived from lwIP's contrib/apps/ping/ping.c.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 cmd/Kconfig        |  11 +--
 cmd/net-lwip.c     |   8 ++
 include/net-lwip.h |   1 +
 net/lwip/Makefile  |   1 +
 net/lwip/ping.c    | 177 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 193 insertions(+), 5 deletions(-)
 create mode 100644 net/lwip/ping.c

diff --git a/cmd/Kconfig b/cmd/Kconfig
index f1372a025b7..d784a454915 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2018,11 +2018,6 @@ config CMD_WGET
 	  wget is a simple command to download kernel, or other files,
 	  from a http server over TCP.
 
-config CMD_PING
-	bool "ping"
-	help
-	  Send ICMP ECHO_REQUEST to network host
-
 config CMD_PING6
 	bool "ping6"
 	depends on IPV6
@@ -2116,6 +2111,12 @@ config CMD_MDIO
 	  The MDIO interface is orthogonal to the MII interface and extends
 	  it by adding access to more registers through indirect addressing.
 
+config CMD_PING
+	bool "ping"
+	select PROT_RAW_LWIP if NET_LWIP
+	help
+	  Send ICMP ECHO_REQUEST to network host
+
 config CMD_TFTPBOOT
 	bool "tftp"
 	select PROT_UDP_LWIP if NET_LWIP
diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
index 80f0872bb8f..feed719beef 100644
--- a/cmd/net-lwip.c
+++ b/cmd/net-lwip.c
@@ -12,6 +12,14 @@ U_BOOT_CMD(
 );
 #endif
 
+#if defined(CONFIG_CMD_PING)
+U_BOOT_CMD(
+	ping,	2,	1,	do_ping,
+	"send ICMP ECHO_REQUEST to network host",
+	"pingAddress"
+);
+#endif
+
 #if defined(CONFIG_CMD_TFTPBOOT)
 U_BOOT_CMD(
 	tftpboot,	3,	0,	do_tftpb,
diff --git a/include/net-lwip.h b/include/net-lwip.h
index 37744b0e2cd..9aa371e962c 100644
--- a/include/net-lwip.h
+++ b/include/net-lwip.h
@@ -17,5 +17,6 @@ struct netif *net_lwip_get_netif(void);
 int net_lwip_rx(struct udevice *udev, struct netif *netif);
 
 int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
+int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 
 #endif /* __NET_LWIP_H__ */
diff --git a/net/lwip/Makefile b/net/lwip/Makefile
index 4e92a101ddb..b5af37a9b18 100644
--- a/net/lwip/Makefile
+++ b/net/lwip/Makefile
@@ -2,4 +2,5 @@ ccflags-y += -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
 
 obj-$(CONFIG_$(SPL_)DM_ETH) += net-lwip.o
 obj-$(CONFIG_CMD_DHCP) += dhcp.o
+obj-$(CONFIG_CMD_PING) += ping.o
 obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
diff --git a/net/lwip/ping.c b/net/lwip/ping.c
new file mode 100644
index 00000000000..8dafa25959f
--- /dev/null
+++ b/net/lwip/ping.c
@@ -0,0 +1,177 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <console.h>
+#include <dm/device.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <lwip/icmp.h>
+#include <lwip/inet_chksum.h>
+#include <lwip/raw.h>
+#include <lwip/timeouts.h>
+#include <net.h>
+#include <time.h>
+
+#define PING_DELAY_MS 1000
+#define PING_COUNT 5
+/* Ping identifier - must fit on a u16_t */
+#define PING_ID 0xAFAF
+
+struct ping_ctx {
+	ip_addr_t target;
+	struct raw_pcb *pcb;
+	struct icmp_echo_hdr *iecho;
+	uint16_t seq_num;
+	bool alive;
+};
+
+static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p,
+		      const ip_addr_t *addr)
+{
+	struct ping_ctx *ctx = arg;
+	struct icmp_echo_hdr *iecho = ctx->iecho;
+
+	if (addr->addr != ctx->target.addr)
+		return 0;
+
+	if ((p->tot_len >= (IP_HLEN + sizeof(struct icmp_echo_hdr))) &&
+	    pbuf_remove_header(p, IP_HLEN) == 0) {
+		iecho = (struct icmp_echo_hdr *)p->payload;
+
+		if ((iecho->id == PING_ID) &&
+		    (iecho->seqno == lwip_htons(ctx->seq_num))) {
+			ctx->alive = true;
+			printf("host %s is alive\n", ipaddr_ntoa(addr));
+			pbuf_free(p);
+			return 1; /* eat the packet */
+		}
+		/* not eaten, restore original packet */
+		pbuf_add_header(p, IP_HLEN);
+	}
+
+	return 0; /* don't eat the packet */
+}
+
+static int ping_raw_init(struct ping_ctx *ctx)
+{
+	ctx->pcb = raw_new(IP_PROTO_ICMP);
+	if (!ctx->pcb)
+		return -ENOMEM;
+
+	raw_recv(ctx->pcb, ping_recv, ctx);
+	raw_bind(ctx->pcb, IP_ADDR_ANY);
+
+	return 0;
+}
+
+static void ping_raw_stop(struct ping_ctx *ctx)
+{
+	if (ctx->pcb)
+		raw_remove(ctx->pcb);
+}
+
+static void ping_prepare_echo(struct ping_ctx *ctx)
+{
+	struct icmp_echo_hdr *iecho = ctx->iecho;
+
+	ICMPH_TYPE_SET(iecho, ICMP_ECHO);
+	ICMPH_CODE_SET(iecho, 0);
+	iecho->chksum = 0;
+	iecho->id = PING_ID;
+	iecho->seqno = lwip_htons(ctx->seq_num);
+
+	iecho->chksum = inet_chksum(iecho, sizeof(*iecho));
+}
+
+static void ping_send_icmp(struct ping_ctx *ctx)
+{
+	struct pbuf *p;
+	size_t ping_size = sizeof(struct icmp_echo_hdr);
+
+	p = pbuf_alloc(PBUF_IP, (u16_t)ping_size, PBUF_RAM);
+	if (!p)
+		return;
+
+	if ((p->len == p->tot_len) && !p->next) {
+		ctx->iecho = (struct icmp_echo_hdr *)p->payload;
+		ping_prepare_echo(ctx);
+		raw_sendto(ctx->pcb, p, &ctx->target);
+	}
+
+	pbuf_free(p);
+}
+
+static void ping_send(void *arg)
+{
+	struct ping_ctx *ctx = arg;
+
+	ctx->seq_num++;
+	if (ctx->seq_num <= PING_COUNT) {
+		ping_send_icmp(ctx);
+		sys_timeout(PING_DELAY_MS, ping_send, ctx);
+	}
+}
+
+static int ping_loop(struct udevice *udev, const ip_addr_t* addr)
+{
+	struct ping_ctx ctx = {};
+	struct netif *netif;
+	int ret;
+
+	netif = net_lwip_new_netif(udev);
+	if (!netif)
+		return CMD_RET_FAILURE;
+
+	printf("Using %s device\n", udev->name);
+
+	ret = ping_raw_init(&ctx);
+	if (ret < 0) {
+		net_lwip_remove_netif(netif);
+		return ret;
+	}
+
+	ctx.target = *addr;
+
+	ping_send(&ctx);
+
+	do {
+		sys_check_timeouts();
+		net_lwip_rx(udev, netif);
+		if (ctx.alive)
+			break;
+		if (ctrlc()) {
+			printf("\nAbort\n");
+			break;
+		}
+	} while (ctx.seq_num <= PING_COUNT);
+
+	sys_untimeout(ping_send, &ctx);
+	ping_raw_stop(&ctx);
+
+	net_lwip_remove_netif(netif);
+
+	if (ctx.alive)
+		return 0;
+
+	printf("ping failed; host %s is not alive\n", ipaddr_ntoa(addr));
+	return -1;
+}
+
+int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	ip_addr_t addr;
+
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (!ipaddr_aton(argv[1], &addr))
+		return CMD_RET_USAGE;
+
+	eth_set_current();
+
+	if (ping_loop(eth_get_dev(), &addr) < 0)
+		return CMD_RET_FAILURE;
+
+	return CMD_RET_SUCCESS;
+}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 17/29] net-lwip: add dns command
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (15 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 16/29] net-lwip: add ping command Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 18/29] net: split cmd/net.c into cmd/net.c and cmd/net-common.c Jerome Forissier
                   ` (14 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Mattijs Korpershoek,
	Heinrich Schuchardt, AKASHI Takahiro

Add CMD_DNS when NET_LWIP is enabled to provide the dns command using
lwIP.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 cmd/Kconfig        |  11 ++--
 cmd/net-lwip.c     |   8 +++
 include/net-lwip.h |   1 +
 net/lwip/Makefile  |   1 +
 net/lwip/dns.c     | 127 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 143 insertions(+), 5 deletions(-)
 create mode 100644 net/lwip/dns.c

diff --git a/cmd/Kconfig b/cmd/Kconfig
index d784a454915..b50fff78a68 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2036,11 +2036,6 @@ config CMD_SNTP
 	help
 	  Synchronize RTC via network
 
-config CMD_DNS
-	bool "dns"
-	help
-	  Lookup the IP of a hostname
-
 config CMD_LINK_LOCAL
 	bool "linklocal"
 	select LIB_RAND
@@ -2088,6 +2083,12 @@ config CMD_DHCP
 	help
 	  Boot image via network using DHCP/TFTP protocol
 
+config CMD_DNS
+	bool "dns"
+	select PROT_DNS_LWIP if NET_LWIP
+	help
+	  Lookup the IP of a hostname
+
 config CMD_MII
 	bool "mii"
 	imply CMD_MDIO
diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
index feed719beef..c021da6a674 100644
--- a/cmd/net-lwip.c
+++ b/cmd/net-lwip.c
@@ -27,3 +27,11 @@ U_BOOT_CMD(
 	"[loadAddress] [[hostIPaddr:]bootfilename]"
 );
 #endif
+
+#if defined(CONFIG_CMD_DNS)
+U_BOOT_CMD(
+	dns,	3,	1,	do_dns,
+	"lookup the IP of a hostname",
+	"hostname [envvar]"
+);
+#endif
diff --git a/include/net-lwip.h b/include/net-lwip.h
index 9aa371e962c..ff9d03b23e8 100644
--- a/include/net-lwip.h
+++ b/include/net-lwip.h
@@ -17,6 +17,7 @@ struct netif *net_lwip_get_netif(void);
 int net_lwip_rx(struct udevice *udev, struct netif *netif);
 
 int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
+int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 
 #endif /* __NET_LWIP_H__ */
diff --git a/net/lwip/Makefile b/net/lwip/Makefile
index b5af37a9b18..645d8a8c457 100644
--- a/net/lwip/Makefile
+++ b/net/lwip/Makefile
@@ -2,5 +2,6 @@ ccflags-y += -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
 
 obj-$(CONFIG_$(SPL_)DM_ETH) += net-lwip.o
 obj-$(CONFIG_CMD_DHCP) += dhcp.o
+obj-$(CONFIG_CMD_DNS) += dns.o
 obj-$(CONFIG_CMD_PING) += ping.o
 obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
diff --git a/net/lwip/dns.c b/net/lwip/dns.c
new file mode 100644
index 00000000000..4b937feaee1
--- /dev/null
+++ b/net/lwip/dns.c
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <console.h>
+#include <lwip/dns.h>
+#include <lwip/timeouts.h>
+#include <net.h>
+#include <time.h>
+
+#define DNS_RESEND_MS 1000
+#define DNS_TIMEOUT_MS 10000
+
+struct dns_cb_arg {
+	ip_addr_t host_ipaddr;
+	const char *var;
+	bool done;
+};
+
+static void do_dns_tmr(void *arg)
+{
+	dns_tmr();
+}
+
+static void dns_cb(const char *name, const ip_addr_t *ipaddr, void *arg)
+{
+	struct dns_cb_arg *dns_cb_arg = arg;
+	char *ipstr = ip4addr_ntoa(ipaddr);
+
+	dns_cb_arg->done = true;
+
+	if (!ipaddr) {
+		printf("DNS: host not found\n");
+		dns_cb_arg->host_ipaddr.addr = 0;
+		return;
+	}
+
+	if (dns_cb_arg->var)
+		env_set(dns_cb_arg->var, ipstr);
+
+	printf("%s\n", ipstr);
+}
+
+static int dns_loop(struct udevice *udev, const char *name, const char *var)
+{
+	struct dns_cb_arg dns_cb_arg = { };
+	bool has_server = false;
+	struct netif *netif;
+	ip_addr_t ipaddr;
+	ip_addr_t ns;
+	ulong start;
+	char *nsenv;
+	int ret;
+
+	dns_cb_arg.var = var;
+
+	netif = net_lwip_new_netif(udev);
+	if (!netif)
+		return -1;
+
+	dns_init();
+
+	nsenv = env_get("dnsip");
+	if (nsenv && ipaddr_aton(nsenv, &ns)) {
+		dns_setserver(0, &ns);
+		has_server = true;
+	}
+
+	nsenv = env_get("dnsip2");
+	if (nsenv && ipaddr_aton(nsenv, &ns)) {
+		dns_setserver(1, &ns);
+		has_server = true;
+	}
+
+	if (!has_server) {
+		log_err("No valid name server (dnsip/dnsip2)\n");
+		net_lwip_remove_netif(netif);
+		return CMD_RET_FAILURE;
+	}
+
+	dns_cb_arg.done = false;
+
+	ret = dns_gethostbyname(name, &ipaddr, dns_cb, &dns_cb_arg);
+
+	if (ret == ERR_OK) {
+		dns_cb(name, &ipaddr, &dns_cb_arg);
+	} else if (ret == ERR_INPROGRESS) {
+		start = get_timer(0);
+		sys_timeout(DNS_RESEND_MS, do_dns_tmr, NULL);
+		do {
+			net_lwip_rx(udev, netif);
+			if (dns_cb_arg.done)
+				break;
+			sys_check_timeouts();
+			if (ctrlc()) {
+				printf("\nAbort\n");
+				break;
+			}
+		} while (get_timer(start) < DNS_TIMEOUT_MS);
+		sys_untimeout(do_dns_tmr, NULL);
+	}
+
+	net_lwip_remove_netif(netif);
+
+	if (dns_cb_arg.done && dns_cb_arg.host_ipaddr.addr != 0)
+		return CMD_RET_SUCCESS;
+
+	return CMD_RET_FAILURE;
+}
+
+int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	char *name;
+	char *var = NULL;
+
+	if (argc == 1 || argc > 3)
+		return CMD_RET_USAGE;
+
+	name = argv[1];
+
+	if (argc == 3)
+		var = argv[2];
+
+	eth_set_current();
+
+	return dns_loop(eth_get_dev(), name, var);
+}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 18/29] net: split cmd/net.c into cmd/net.c and cmd/net-common.c
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (16 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 17/29] net-lwip: add dns command Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 19/29] net-lwip: add wget command Jerome Forissier
                   ` (13 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Heinrich Schuchardt, Francis Laniel, Marek Vasut

Extract some code from cmd/net.c that will be useful in a subsequent
commit to implement wget with NET_LWIP.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
---
 cmd/Makefile     |   5 ++-
 cmd/net-common.c | 109 ++++++++++++++++++++++++++++++++++++++++++++
 cmd/net.c        | 115 -----------------------------------------------
 3 files changed, 113 insertions(+), 116 deletions(-)
 create mode 100644 cmd/net-common.c

diff --git a/cmd/Makefile b/cmd/Makefile
index 1c8cc42503d..75e85feb017 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -130,7 +130,10 @@ obj-$(CONFIG_CMD_NAND) += nand.o
 ifdef CONFIG_CMD_NET
 obj-$(CONFIG_NET) += net.o
 obj-$(CONFIG_NET_LWIP) += net-lwip.o
-CFLAGS_net-lwip.o := -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
+obj-$(filter y,$(CONFIG_CMD_NET) $(CONFIG_CMD_NET_LWIP)) += net-common.o
+lwip-includes := -I$(srctree)/lib/lwip/lwip/src/include -I$(srctree)/lib/lwip/u-boot
+CFLAGS_net-lwip.o := $(lwip-includes)
+CFLAGS_net-common.o := $(lwip-includes)
 endif
 obj-$(CONFIG_ENV_SUPPORT) += nvedit.o
 obj-$(CONFIG_CMD_NVEDIT_EFI) += nvedit_efi.o
diff --git a/cmd/net-common.c b/cmd/net-common.c
new file mode 100644
index 00000000000..1c9fb83b896
--- /dev/null
+++ b/cmd/net-common.c
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ */
+
+#include <command.h>
+#include <dm/device.h>
+#include <dm/uclass.h>
+#include <net.h>
+#include <linux/compat.h>
+#include <linux/ethtool.h>
+
+static int do_net_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	const struct udevice *current = eth_get_dev();
+	unsigned char env_enetaddr[ARP_HLEN];
+	const struct udevice *dev;
+	struct uclass *uc;
+
+	uclass_id_foreach_dev(UCLASS_ETH, dev, uc) {
+		eth_env_get_enetaddr_by_index("eth", dev_seq(dev), env_enetaddr);
+		printf("eth%d : %s %pM %s\n", dev_seq(dev), dev->name, env_enetaddr,
+		       current == dev ? "active" : "");
+	}
+	return CMD_RET_SUCCESS;
+}
+
+static int do_net_stats(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	int nstats, err, i, off;
+	struct udevice *dev;
+	u64 *values;
+	u8 *strings;
+
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	err = uclass_get_device_by_name(UCLASS_ETH, argv[1], &dev);
+	if (err) {
+		printf("Could not find device %s\n", argv[1]);
+		return CMD_RET_FAILURE;
+	}
+
+	if (!eth_get_ops(dev)->get_sset_count ||
+	    !eth_get_ops(dev)->get_strings ||
+	    !eth_get_ops(dev)->get_stats) {
+		printf("Driver does not implement stats dump!\n");
+		return CMD_RET_FAILURE;
+	}
+
+	nstats = eth_get_ops(dev)->get_sset_count(dev);
+	strings = kcalloc(nstats, ETH_GSTRING_LEN, GFP_KERNEL);
+	if (!strings)
+		return CMD_RET_FAILURE;
+
+	values = kcalloc(nstats, sizeof(u64), GFP_KERNEL);
+	if (!values)
+		goto err_free_strings;
+
+	eth_get_ops(dev)->get_strings(dev, strings);
+	eth_get_ops(dev)->get_stats(dev, values);
+
+	off = 0;
+	for (i = 0; i < nstats; i++) {
+		printf("  %s: %llu\n", &strings[off], values[i]);
+		off += ETH_GSTRING_LEN;
+	};
+
+	kfree(strings);
+	kfree(values);
+
+	return CMD_RET_SUCCESS;
+
+err_free_strings:
+	kfree(strings);
+
+	return CMD_RET_FAILURE;
+}
+
+static struct cmd_tbl cmd_net[] = {
+	U_BOOT_CMD_MKENT(list, 1, 0, do_net_list, "", ""),
+	U_BOOT_CMD_MKENT(stats, 2, 0, do_net_stats, "", ""),
+};
+
+static int do_net(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
+{
+	struct cmd_tbl *cp;
+
+	cp = find_cmd_tbl(argv[1], cmd_net, ARRAY_SIZE(cmd_net));
+
+	/* Drop the net command */
+	argc--;
+	argv++;
+
+	if (!cp || argc > cp->maxargs)
+		return CMD_RET_USAGE;
+	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
+		return CMD_RET_SUCCESS;
+
+	return cp->cmd(cmdtp, flag, argc, argv);
+}
+
+U_BOOT_CMD(
+	net, 3, 1, do_net,
+	"NET sub-system",
+	"list - list available devices\n"
+	"stats <device> - dump statistics for specified device\n"
+);
diff --git a/cmd/net.c b/cmd/net.c
index 53ce2bc5d0c..c90578e1b9f 100644
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -674,118 +674,3 @@ U_BOOT_CMD(
 );
 
 #endif  /* CONFIG_CMD_LINK_LOCAL */
-
-static int do_net_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
-{
-	const struct udevice *current = eth_get_dev();
-	unsigned char env_enetaddr[ARP_HLEN];
-	const struct udevice *dev;
-	struct uclass *uc;
-
-	uclass_id_foreach_dev(UCLASS_ETH, dev, uc) {
-		eth_env_get_enetaddr_by_index("eth", dev_seq(dev), env_enetaddr);
-		printf("eth%d : %s %pM %s\n", dev_seq(dev), dev->name, env_enetaddr,
-		       current == dev ? "active" : "");
-	}
-	return CMD_RET_SUCCESS;
-}
-
-static int do_net_stats(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
-{
-	int nstats, err, i, off;
-	struct udevice *dev;
-	u64 *values;
-	u8 *strings;
-
-	if (argc < 2)
-		return CMD_RET_USAGE;
-
-	err = uclass_get_device_by_name(UCLASS_ETH, argv[1], &dev);
-	if (err) {
-		printf("Could not find device %s\n", argv[1]);
-		return CMD_RET_FAILURE;
-	}
-
-	if (!eth_get_ops(dev)->get_sset_count ||
-	    !eth_get_ops(dev)->get_strings ||
-	    !eth_get_ops(dev)->get_stats) {
-		printf("Driver does not implement stats dump!\n");
-		return CMD_RET_FAILURE;
-	}
-
-	nstats = eth_get_ops(dev)->get_sset_count(dev);
-	strings = kcalloc(nstats, ETH_GSTRING_LEN, GFP_KERNEL);
-	if (!strings)
-		return CMD_RET_FAILURE;
-
-	values = kcalloc(nstats, sizeof(u64), GFP_KERNEL);
-	if (!values)
-		goto err_free_strings;
-
-	eth_get_ops(dev)->get_strings(dev, strings);
-	eth_get_ops(dev)->get_stats(dev, values);
-
-	off = 0;
-	for (i = 0; i < nstats; i++) {
-		printf("  %s: %llu\n", &strings[off], values[i]);
-		off += ETH_GSTRING_LEN;
-	};
-
-	return CMD_RET_SUCCESS;
-
-err_free_strings:
-	kfree(strings);
-
-	return CMD_RET_FAILURE;
-}
-
-static struct cmd_tbl cmd_net[] = {
-	U_BOOT_CMD_MKENT(list, 1, 0, do_net_list, "", ""),
-	U_BOOT_CMD_MKENT(stats, 2, 0, do_net_stats, "", ""),
-};
-
-static int do_net(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
-{
-	struct cmd_tbl *cp;
-
-	cp = find_cmd_tbl(argv[1], cmd_net, ARRAY_SIZE(cmd_net));
-
-	/* Drop the net command */
-	argc--;
-	argv++;
-
-	if (!cp || argc > cp->maxargs)
-		return CMD_RET_USAGE;
-	if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
-		return CMD_RET_SUCCESS;
-
-	return cp->cmd(cmdtp, flag, argc, argv);
-}
-
-U_BOOT_CMD(
-	net, 3, 1, do_net,
-	"NET sub-system",
-	"list - list available devices\n"
-	"stats <device> - dump statistics for specified device\n"
-);
-
-#if defined(CONFIG_CMD_NCSI)
-static int do_ncsi(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
-{
-	if (!phy_interface_is_ncsi() || !ncsi_active()) {
-		printf("Device not configured for NC-SI\n");
-		return CMD_RET_FAILURE;
-	}
-
-	if (net_loop(NCSI) < 0)
-		return CMD_RET_FAILURE;
-
-	return CMD_RET_SUCCESS;
-}
-
-U_BOOT_CMD(
-	ncsi,	1,	1,	do_ncsi,
-	"Configure attached NIC via NC-SI",
-	""
-);
-#endif  /* CONFIG_CMD_NCSI */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 19/29] net-lwip: add wget command
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (17 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 18/29] net: split cmd/net.c into cmd/net.c and cmd/net-common.c Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it Jerome Forissier
                   ` (12 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Joe Hershberger, Ramon Fried, Simon Glass, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Jonathan Humphreys

Add support for the wget command with NET_LWIP. The command normally
expects a URL: wget [loadaddr] url, but it also accepts the legacy
syntax: wget [loadaddr] [server:]file.
The server IP may alternatively be supplied via ${httpserverip} which
has higher priority than ${serverip}.

Based on code initially developed by Maxim U.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Co-developed-by: Maxim Uvarov <muvarov@gmail.com>
Cc: Maxim Uvarov <muvarov@gmail.com>
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 cmd/Kconfig        |  18 ++-
 cmd/net-lwip.c     |   8 +
 include/net-lwip.h |  18 +++
 net/lwip/Makefile  |   1 +
 net/lwip/wget.c    | 363 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 400 insertions(+), 8 deletions(-)
 create mode 100644 net/lwip/wget.c

diff --git a/cmd/Kconfig b/cmd/Kconfig
index b50fff78a68..8444ae45bb5 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2010,14 +2010,6 @@ config SYS_DISABLE_AUTOLOAD
 	  is complete.  Enable this option to disable this behavior and instead
 	  require files to be loaded over the network by subsequent commands.
 
-config CMD_WGET
-	bool "wget"
-	select PROT_TCP
-	default y if SANDBOX
-	help
-	  wget is a simple command to download kernel, or other files,
-	  from a http server over TCP.
-
 config CMD_PING6
 	bool "ping6"
 	depends on IPV6
@@ -2125,6 +2117,16 @@ config CMD_TFTPBOOT
 	help
 	  tftpboot - load file via network using TFTP protocol
 
+config CMD_WGET
+	bool "wget"
+	default y if SANDBOX
+	select PROT_TCP if NET
+	select PROT_TCP_LWIP if NET_LWIP
+	select PROT_DNS_LWIP if NET_LWIP
+	help
+	  wget is a simple command to download kernel, or other files,
+	  from a http server over TCP.
+
 endif  # if CMD_NET
 
 config CMD_PXE
diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
index c021da6a674..42f8bd6b259 100644
--- a/cmd/net-lwip.c
+++ b/cmd/net-lwip.c
@@ -35,3 +35,11 @@ U_BOOT_CMD(
 	"hostname [envvar]"
 );
 #endif
+
+#if defined(CONFIG_CMD_WGET)
+U_BOOT_CMD(
+	wget,   3,      1,      do_wget,
+	"boot image via network using HTTP protocol",
+	"[loadAddress] URL"
+);
+#endif
diff --git a/include/net-lwip.h b/include/net-lwip.h
index ff9d03b23e8..1c3583f82a1 100644
--- a/include/net-lwip.h
+++ b/include/net-lwip.h
@@ -16,8 +16,26 @@ void net_lwip_remove_netif(struct netif *netif);
 struct netif *net_lwip_get_netif(void);
 int net_lwip_rx(struct udevice *udev, struct netif *netif);
 
+/**
+ * wget_with_dns() - runs dns host IP address resulution before wget
+ *
+ * @dst_addr:	destination address to download the file
+ * @uri:	uri string of target file of wget
+ * Return:	downloaded file size, negative if failed
+ */
+
+int wget_with_dns(ulong dst_addr, char *uri);
+/**
+ * wget_validate_uri() - varidate the uri
+ *
+ * @uri:	uri string of target file of wget
+ * Return:	true if uri is valid, false if uri is invalid
+ */
+bool wget_validate_uri(char *uri);
+
 int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 int do_dns(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
+int do_wget(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);
 
 #endif /* __NET_LWIP_H__ */
diff --git a/net/lwip/Makefile b/net/lwip/Makefile
index 645d8a8c457..f2558f8763a 100644
--- a/net/lwip/Makefile
+++ b/net/lwip/Makefile
@@ -5,3 +5,4 @@ obj-$(CONFIG_CMD_DHCP) += dhcp.o
 obj-$(CONFIG_CMD_DNS) += dns.o
 obj-$(CONFIG_CMD_PING) += ping.o
 obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
+obj-$(CONFIG_CMD_WGET) += wget.o
diff --git a/net/lwip/wget.c b/net/lwip/wget.c
new file mode 100644
index 00000000000..e8768fc2acd
--- /dev/null
+++ b/net/lwip/wget.c
@@ -0,0 +1,363 @@
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright (C) 2024 Linaro Ltd. */
+
+#include <command.h>
+#include <console.h>
+#include <display_options.h>
+#include <efi_loader.h>
+#include <image.h>
+#include <lwip/apps/http_client.h>
+#include <lwip/timeouts.h>
+#include <mapmem.h>
+#include <net.h>
+#include <time.h>
+
+#define SERVER_NAME_SIZE 200
+#define HTTP_PORT_DEFAULT 80
+#define PROGRESS_PRINT_STEP_BYTES (100 * 1024)
+
+enum done_state {
+        NOT_DONE = 0,
+        SUCCESS = 1,
+        FAILURE = 2
+};
+
+struct wget_ctx {
+	char *path;
+	ulong daddr;
+	ulong saved_daddr;
+	ulong size;
+	ulong prevsize;
+	ulong start_time;
+	enum done_state done;
+};
+
+static int parse_url(char *url, char *host, u16 *port, char **path)
+{
+	char *p, *pp;
+	long lport;
+
+	p = strstr(url, "http://");
+	if (!p) {
+		log_err("only http:// is supported\n");
+		return -EINVAL;
+	}
+
+	p += strlen("http://");
+
+	/* Parse hostname */
+	pp = strchr(p, ':');
+	if (!pp)
+		pp = strchr(p, '/');
+	if (!pp)
+		return -EINVAL;
+
+	if (p + SERVER_NAME_SIZE <= pp)
+		return -EINVAL;
+
+	memcpy(host, p, pp - p);
+	host[pp - p] = '\0';
+
+	if (*pp == ':') {
+		/* Parse port number */
+		p = pp + 1;
+		lport = simple_strtol(p, &pp, 10);
+		if (pp && *pp != '/')
+			return -EINVAL;
+		if (lport > 65535)
+			return -EINVAL;
+		*port = (u16)lport;
+	} else {
+		*port = HTTP_PORT_DEFAULT;
+	}
+	if (*pp != '/')
+		return -EINVAL;
+	*path = pp;
+
+	return 0;
+}
+
+/*
+ * Legacy syntax support
+ * Convert [<server_name_or_ip>:]filename into a URL if needed
+ */
+static int parse_legacy_arg(char *arg, char *nurl, size_t rem)
+{
+	char *p = nurl;
+	size_t n;
+	char *col = strchr(arg, ':');
+	char *env;
+	char *server;
+	char *path;
+
+	if (strstr(arg, "http") == arg) {
+		n = snprintf(nurl, rem, "%s", arg);
+		if (n < 0 || n > rem)
+			return -1;
+		return 0;
+	}
+
+	n = snprintf(p, rem, "%s", "http://");
+	if (n < 0 || n > rem)
+		return -1;
+	p += n;
+	rem -= n;
+
+	if (col) {
+		n = col - arg;
+		server = arg;
+		path = col + 1;
+	} else {
+		env = env_get("httpserverip");
+		if (!env)
+			env = env_get("serverip");
+		if (!env) {
+			log_err("error: httpserver/serverip has to be set\n");
+			return -1;
+		}
+		n = strlen(env);
+		server = env;
+		path = arg;
+	}
+
+	if (rem < n)
+		return -1;
+	strncpy(p, server, n);
+	p += n;
+	rem -= n;
+	if (rem < 1)
+		return -1;
+	*p = '/';
+	p++;
+	rem--;
+	n = strlen(path);
+	if (rem < n)
+		return -1;
+	strncpy(p, path, n);
+	p += n;
+	rem -= n;
+	if (rem < 1)
+		return -1;
+	*p = '\0';
+
+	return 0;
+}
+
+static err_t httpc_recv_cb(void *arg, struct altcp_pcb *pcb, struct pbuf *pbuf,
+			   err_t err)
+{
+	struct wget_ctx *ctx = arg;
+	struct pbuf *buf;
+
+	if (!pbuf)
+		return ERR_BUF;
+
+	if (!ctx->start_time)
+		ctx->start_time = get_timer(0);
+
+	for (buf = pbuf; buf; buf = buf->next) {
+		memcpy((void *)ctx->daddr, buf->payload, buf->len);
+		ctx->daddr += buf->len;
+		ctx->size += buf->len;
+		if (ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
+			printf("#");
+			ctx->prevsize = ctx->size;
+		}
+	}
+
+	altcp_recved(pcb, pbuf->tot_len);
+	pbuf_free(pbuf);
+	return ERR_OK;
+}
+
+static void httpc_result_cb(void *arg, httpc_result_t httpc_result,
+			    u32_t rx_content_len, u32_t srv_res, err_t err)
+{
+	struct wget_ctx *ctx = arg;
+	ulong elapsed;
+
+	if (httpc_result != HTTPC_RESULT_OK) {
+		log_err("\nHTTP client error %d\n", httpc_result);
+		ctx->done = FAILURE;
+		return;
+	}
+	if (srv_res != 200) {
+		log_err("\nHTTP server error %d\n", srv_res);
+		ctx->done = FAILURE;
+		return;
+	}
+
+	elapsed = get_timer(ctx->start_time);
+	if (!elapsed)
+		elapsed = 1;
+	if (rx_content_len > PROGRESS_PRINT_STEP_BYTES)
+		printf("\n");
+	printf("%u bytes transferred in %lu ms (", rx_content_len, elapsed);
+	print_size(rx_content_len / elapsed * 1000, "/s)\n");
+	printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
+	efi_set_bootdev("Net", "", ctx->path, map_sysmem(ctx->saved_daddr, 0),
+			rx_content_len);
+	if (env_set_hex("filesize", rx_content_len) ||
+	    env_set_hex("fileaddr", ctx->saved_daddr)) {
+		log_err("Could not set filesize or fileaddr\n");
+		ctx->done = FAILURE;
+		return;
+	}
+
+	ctx->done = SUCCESS;
+}
+
+static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri)
+{
+	char server_name[SERVER_NAME_SIZE];
+	httpc_connection_t conn;
+	httpc_state_t *state;
+	struct netif *netif;
+	struct wget_ctx ctx;
+	char *path;
+	u16 port;
+
+	ctx.daddr = dst_addr;
+	ctx.saved_daddr = dst_addr;
+	ctx.done = NOT_DONE;
+	ctx.size = 0;
+	ctx.prevsize = 0;
+	ctx.start_time = 0;
+
+	if (parse_url(uri, server_name, &port, &path))
+		return CMD_RET_USAGE;
+
+	netif = net_lwip_new_netif(udev);
+	if (!netif)
+		return -1;
+
+	memset(&conn, 0, sizeof(conn));
+	conn.result_fn = httpc_result_cb;
+	ctx.path = path;
+	if (httpc_get_file_dns(server_name, port, path, &conn, httpc_recv_cb,
+			       &ctx, &state)) {
+		net_lwip_remove_netif(netif);
+		return CMD_RET_FAILURE;
+	}
+
+	while (!ctx.done) {
+		net_lwip_rx(udev, netif);
+		sys_check_timeouts();
+		if (ctrlc())
+			break;
+	}
+
+	net_lwip_remove_netif(netif);
+
+	if (ctx.done == SUCCESS)
+		return 0;
+
+	return -1;
+}
+
+int wget_with_dns(ulong dst_addr, char *uri)
+{
+	eth_set_current();
+
+	return wget_loop(eth_get_dev(), dst_addr, uri);
+}
+
+int do_wget(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
+{
+	char *end;
+	char *url;
+	ulong dst_addr;
+	char nurl[1024];
+
+	if (argc < 2 || argc > 3)
+		return CMD_RET_USAGE;
+
+	dst_addr = hextoul(argv[1], &end);
+        if (end == (argv[1] + strlen(argv[1]))) {
+		if (argc < 3)
+			return CMD_RET_USAGE;
+		url = argv[2];
+	} else {
+		dst_addr = image_load_addr;
+		url = argv[1];
+	}
+
+	if (parse_legacy_arg(url, nurl, sizeof(nurl)))
+	    return CMD_RET_FAILURE;
+
+	if (wget_with_dns(dst_addr, nurl))
+		return CMD_RET_FAILURE;
+
+	return CMD_RET_SUCCESS;
+}
+
+/**
+ * wget_validate_uri() - validate the uri for wget
+ *
+ * @uri:	uri string
+ *
+ * This function follows the current U-Boot wget implementation.
+ * scheme: only "http:" is supported
+ * authority:
+ *   - user information: not supported
+ *   - host: supported
+ *   - port: not supported(always use the default port)
+ *
+ * Uri is expected to be correctly percent encoded.
+ * This is the minimum check, control codes(0x1-0x19, 0x7F, except '\0')
+ * and space character(0x20) are not allowed.
+ *
+ * TODO: stricter uri conformance check
+ *
+ * Return:	true on success, false on failure
+ */
+bool wget_validate_uri(char *uri)
+{
+	char c;
+	bool ret = true;
+	char *str_copy, *s, *authority;
+
+	for (c = 0x1; c < 0x21; c++) {
+		if (strchr(uri, c)) {
+			log_err("invalid character is used\n");
+			return false;
+		}
+	}
+	if (strchr(uri, 0x7f)) {
+		log_err("invalid character is used\n");
+		return false;
+	}
+
+	if (strncmp(uri, "http://", 7)) {
+		log_err("only http:// is supported\n");
+		return false;
+	}
+	str_copy = strdup(uri);
+	if (!str_copy)
+		return false;
+
+	s = str_copy + strlen("http://");
+	authority = strsep(&s, "/");
+	if (!s) {
+		log_err("invalid uri, no file path\n");
+		ret = false;
+		goto out;
+	}
+	s = strchr(authority, '@');
+	if (s) {
+		log_err("user information is not supported\n");
+		ret = false;
+		goto out;
+	}
+	s = strchr(authority, ':');
+	if (s) {
+		log_err("user defined port is not supported\n");
+		ret = false;
+		goto out;
+	}
+
+out:
+	free(str_copy);
+
+	return ret;
+}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it.
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (18 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 19/29] net-lwip: add wget command Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  7:11   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 21/29] cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y Jerome Forissier
                   ` (11 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jonathan Humphreys, Jerome Forissier,
	Joe Hershberger, Ramon Fried, Tom Rini

From: Jonathan Humphreys <j-humphreys@ti.com>

Signed-off-by: Jonathan Humphreys <j-humphreys@ti.com>
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 net/lwip/wget.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/net/lwip/wget.c b/net/lwip/wget.c
index e8768fc2acd..b495ebd1aa9 100644
--- a/net/lwip/wget.c
+++ b/net/lwip/wget.c
@@ -349,12 +349,6 @@ bool wget_validate_uri(char *uri)
 		ret = false;
 		goto out;
 	}
-	s = strchr(authority, ':');
-	if (s) {
-		log_err("user defined port is not supported\n");
-		ret = false;
-		goto out;
-	}
 
 out:
 	free(str_copy);
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 21/29] cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (19 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig Jerome Forissier
                   ` (10 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Marek Vasut, Sughosh Ganu

Support "bdinfo -e" when lwIP is selected.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
---
 cmd/bdinfo.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/cmd/bdinfo.c b/cmd/bdinfo.c
index f6e534dd5bb..4c0e2adabc3 100644
--- a/cmd/bdinfo.c
+++ b/cmd/bdinfo.c
@@ -151,7 +151,7 @@ static int bdinfo_print_all(struct bd_info *bd)
 	bdinfo_print_num_l("relocaddr", gd->relocaddr);
 	bdinfo_print_num_l("reloc off", gd->reloc_off);
 	printf("%-12s= %u-bit\n", "Build", (uint)sizeof(void *) * 8);
-	if (IS_ENABLED(CONFIG_CMD_NET))
+	if (IS_ENABLED(CONFIG_CMD_NET) || IS_ENABLED(CONFIG_CMD_NET_LWIP))
 		print_eth();
 	bdinfo_print_num_l("fdt_blob", (ulong)map_to_sysmem(gd->fdt_blob));
 	if (IS_ENABLED(CONFIG_VIDEO))
@@ -192,7 +192,8 @@ int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 		case 'a':
 			return bdinfo_print_all(bd);
 		case 'e':
-			if (!IS_ENABLED(CONFIG_CMD_NET))
+			if (!IS_ENABLED(CONFIG_CMD_NET) &&
+			    !IS_ENABLED(CONFIG_CMD_NET_LWIP))
 				return CMD_RET_USAGE;
 			print_eth();
 			return CMD_RET_SUCCESS;
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (20 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 21/29] cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 16:44   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 23/29] lwip: tftp: add support of blksize option to client Jerome Forissier
                   ` (9 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini

Add qemu_arm64_lwip_defconfig which #include's qemu_arm64_defconfig and
selects NET_LWIP instead of NET. This config has all the supported net
commands enabled.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 configs/qemu_arm64_lwip_defconfig | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 configs/qemu_arm64_lwip_defconfig

diff --git a/configs/qemu_arm64_lwip_defconfig b/configs/qemu_arm64_lwip_defconfig
new file mode 100644
index 00000000000..d3d8ef16e66
--- /dev/null
+++ b/configs/qemu_arm64_lwip_defconfig
@@ -0,0 +1,9 @@
+#include <configs/qemu_arm64_defconfig>
+
+CONFIG_ARM=y
+CONFIG_ARCH_QEMU=y
+
+CONFIG_NET_LWIP=y
+CONFIG_CMD_DNS=y
+CONFIG_CMD_WGET=y
+CONFIG_EFI_HTTP_BOOT=y
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 23/29] lwip: tftp: add support of blksize option to client
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (21 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  6:41   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 24/29] net-lwip: add TFTP_BLOCKSIZE Jerome Forissier
                   ` (8 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini

The TFTP protocol uses a default block size of 512 bytes. This value is
sub-optimal for ethernet devices, which have a MTU (Maximum Transmission
Unit) of 1500 bytes. When taking into acount the overhead of the IP and
UDP layers, this leaves 1468 bytes for the TFTP payload.

This patch introduces a new function: tftp_client_set_blksize() which
may be used to change the block size from the default. It has to be
called after tftp_client_init() and before tftp_get(). If the server
does not support the option, the client will still accept to receive
512-byte blocks.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 lib/lwip/lwip/src/apps/tftp/tftp.c            | 94 +++++++++++++++++--
 .../lwip/src/include/lwip/apps/tftp_client.h  |  1 +
 2 files changed, 89 insertions(+), 6 deletions(-)

diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
index 74fc1fbe586..8e0c071772a 100644
--- a/lib/lwip/lwip/src/apps/tftp/tftp.c
+++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
@@ -57,7 +57,7 @@
 #include "lwip/timeouts.h"
 #include "lwip/debug.h"
 
-#define TFTP_MAX_PAYLOAD_SIZE 512
+#define TFTP_DEFAULT_BLOCK_SIZE 512
 #define TFTP_HEADER_LENGTH    4
 
 #define TFTP_RRQ   1
@@ -65,6 +65,7 @@
 #define TFTP_DATA  3
 #define TFTP_ACK   4
 #define TFTP_ERROR 5
+#define TFTP_OACK  6
 
 enum tftp_error {
   TFTP_ERROR_FILE_NOT_FOUND    = 1,
@@ -88,9 +89,11 @@ struct tftp_state {
   int timer;
   int last_pkt;
   u16_t blknum;
+  u16_t blksize;
   u8_t retries;
   u8_t mode_write;
   u8_t tftp_mode;
+  bool wait_oack;
 };
 
 static struct tftp_state tftp_state;
@@ -137,10 +140,24 @@ send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname,
 {
   size_t fname_length = strlen(fname)+1;
   size_t mode_length = strlen(mode)+1;
-  struct pbuf* p = init_packet(opcode, 0, fname_length + mode_length - 2);
+  size_t blksize_length = 0;
+  struct pbuf* p;
   char* payload;
   err_t ret;
 
+  if (tftp_state.blksize) {
+    blksize_length = 14; /* maximum (blksize is a u16_t): 'blksize\0XXXXX\0' */
+    if (tftp_state.blksize < 10000)
+	    blksize_length--;
+    if (tftp_state.blksize < 1000)
+	    blksize_length--;
+    if (tftp_state.blksize < 100)
+	    blksize_length--;
+    if (tftp_state.blksize < 10)
+	    blksize_length--;
+  }
+
+  p = init_packet(opcode, 0, fname_length + mode_length + blksize_length - 2);
   if (p == NULL) {
     return ERR_MEM;
   }
@@ -148,7 +165,10 @@ send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname,
   payload = (char*) p->payload;
   MEMCPY(payload+2,              fname, fname_length);
   MEMCPY(payload+2+fname_length, mode,  mode_length);
+  if (tftp_state.blksize)
+    sprintf(payload+2+fname_length+mode_length, "blksize%c%d%c", 0, tftp_state.blksize, 0);
 
+  tftp_state.wait_oack = true;
   ret = udp_sendto(tftp_state.upcb, p, addr, port);
   pbuf_free(p);
   return ret;
@@ -221,14 +241,14 @@ send_data(const ip_addr_t *addr, u16_t port)
     pbuf_free(tftp_state.last_data);
   }
 
-  tftp_state.last_data = init_packet(TFTP_DATA, tftp_state.blknum, TFTP_MAX_PAYLOAD_SIZE);
+  tftp_state.last_data = init_packet(TFTP_DATA, tftp_state.blknum, TFTP_DEFAULT_BLOCK_SIZE);
   if (tftp_state.last_data == NULL) {
     return;
   }
 
   payload = (u16_t *) tftp_state.last_data->payload;
 
-  ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_MAX_PAYLOAD_SIZE);
+  ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_DEFAULT_BLOCK_SIZE);
   if (ret < 0) {
     send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Error occurred while reading the file.");
     close_handle();
@@ -239,6 +259,28 @@ send_data(const ip_addr_t *addr, u16_t port)
   resend_data(addr, port);
 }
 
+static u16_t payload_size(void)
+{
+  if (tftp_state.blksize)
+    return tftp_state.blksize;
+  return TFTP_DEFAULT_BLOCK_SIZE;
+}
+
+static const char *
+find_option(struct pbuf *p, const char *option)
+{
+  int i;
+  u16_t optlen = strlen(option);
+  const char *b = p->payload;
+
+  for (i = 0; i + optlen + 1 < p->len; i++) {
+    if (lwip_strnstr(b + i, option, optlen))
+      return b + i + optlen + 2;
+  }
+
+  return NULL;
+}
+
 static void
 tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
 {
@@ -338,6 +380,15 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
       }
 
       blknum = lwip_ntohs(sbuf[1]);
+      if (tftp_state.blksize && tftp_state.wait_oack) {
+        /*
+         * Data received while we are expecting an OACK for our blksize option.
+         * This means the server doesn't support it, let's switch back to the
+         * default block size.
+         */
+       tftp_state.blksize = 0;
+       tftp_state.wait_oack = false;
+      }
       if (blknum == tftp_state.blknum) {
         pbuf_remove_header(p, TFTP_HEADER_LENGTH);
 
@@ -349,7 +400,7 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
           send_ack(addr, port, blknum);
         }
 
-        if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {
+        if (p->tot_len < payload_size()) {
           close_handle();
         } else {
           tftp_state.blknum++;
@@ -386,7 +437,7 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
       lastpkt = 0;
 
       if (tftp_state.last_data != NULL) {
-        lastpkt = tftp_state.last_data->tot_len != (TFTP_MAX_PAYLOAD_SIZE + TFTP_HEADER_LENGTH);
+        lastpkt = tftp_state.last_data->tot_len != (TFTP_DEFAULT_BLOCK_SIZE + TFTP_HEADER_LENGTH);
       }
 
       if (!lastpkt) {
@@ -405,6 +456,25 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
         close_handle();
       }
       break;
+    case PP_HTONS(TFTP_OACK): {
+      const char *optval = find_option(p, "blksize");
+      u16_t srv_blksize = 0;
+      tftp_state.wait_oack = false;
+      if (optval) {
+	if (!tftp_state.blksize) {
+	  /* We did not request this option */
+          send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "blksize unexpected");
+	}
+	srv_blksize = atoi(optval);
+	if (srv_blksize <= 0 || srv_blksize > tftp_state.blksize) {
+	  send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Invalid blksize");
+	}
+	LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: accepting blksize=%d\n", srv_blksize));
+	tftp_state.blksize = srv_blksize;
+      }
+      send_ack(addr, port, 0);
+      break;
+    }
     default:
       send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Unknown operation");
       break;
@@ -495,6 +565,18 @@ tftp_init_client(const struct tftp_context *ctx)
   return tftp_init_common(LWIP_TFTP_MODE_CLIENT, ctx);
 }
 
+/** @ingroup tftp
+ * Set the block size to be used by the TFTP client. The server may choose to
+ * accept a lower value.
+ * @param blksize Block size in bytes
+ */
+void
+tftp_client_set_blksize(u16_t blksize)
+{
+  if (blksize != TFTP_DEFAULT_BLOCK_SIZE)
+    tftp_state.blksize = blksize;
+}
+
 /** @ingroup tftp
  * Deinitialize ("turn off") TFTP client/server.
  */
diff --git a/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h b/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
index 24dbda6a8c9..e1e21d06b67 100644
--- a/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
+++ b/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
@@ -44,6 +44,7 @@ enum tftp_transfer_mode {
 };
 
 err_t tftp_init_client(const struct tftp_context* ctx);
+void tftp_client_set_blksize(u16_t blksize);
 err_t tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
 err_t tftp_put(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
 
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 24/29] net-lwip: add TFTP_BLOCKSIZE
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (22 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 23/29] lwip: tftp: add support of blksize option to client Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 15:46 ` [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
                   ` (7 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Joe Hershberger,
	Ramon Fried, Tom Rini, Anand Moon, Baruch Siach, Simon Glass

Add support for setting the TFTP block size. The default value (1468)
is fine for Ethernet and allows a better throughput than the TFTP
default (512), if the server supports the blksize option of course.

I tested this change with qemu_arm64_lwip_defconfig. The throughput is
now 875 KiB/s vs. 313 KiB/s before. That is still a low number, but I
think we can't expect more without implementing the windowsize option.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
---
 net/Kconfig     | 20 ++++++++++----------
 net/lwip/tftp.c |  2 ++
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/net/Kconfig b/net/Kconfig
index 16a9de47e94..76ab7d91eeb 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -60,16 +60,6 @@ config SYS_FAULT_ECHO_LINK_DOWN
 	  this option is active, then CONFIG_SYS_FAULT_MII_ADDR also needs to
 	  be configured.
 
-config TFTP_BLOCKSIZE
-	int "TFTP block size"
-	default 1468
-	help
-	  Default TFTP block size.
-	  The MTU is typically 1500 for ethernet, so a TFTP block of
-	  1468 (MTU minus eth.hdrs) provides a good throughput with
-	  almost-MTU block sizes.
-	  You can also activate CONFIG_IP_DEFRAG to set a larger block.
-
 config TFTP_PORT
 	bool "Set TFTP UDP source/destination ports via the environment"
 	help
@@ -254,6 +244,16 @@ config NET_RANDOM_ETHADDR
 	  generated. It will be saved to the appropriate environment variable,
 	  too.
 
+config TFTP_BLOCKSIZE
+	int "TFTP block size"
+	default 1468
+	help
+	  Default TFTP block size.
+	  The MTU is typically 1500 for ethernet, so a TFTP block of
+	  1468 (MTU minus eth.hdrs) provides a good throughput with
+	  almost-MTU block sizes.
+	  You can also activate CONFIG_IP_DEFRAG to set a larger block.
+
 endif   # if NET || NET_LWIP
 
 config SYS_RX_ETH_BUFFER
diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c
index 26978643313..f4d0a6aa19a 100644
--- a/net/lwip/tftp.c
+++ b/net/lwip/tftp.c
@@ -139,6 +139,8 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
 	if (!(err == ERR_OK || err == ERR_USE))
 		log_err("tftp_init_client err: %d\n", err);
 
+	tftp_client_set_blksize(CONFIG_TFTP_BLOCKSIZE);
+
 	ctx.start_time = get_timer(0);
 	err = tftp_get(&ctx, &srvip, srvport, fname, TFTP_MODE_OCTET);
 	/* might return different errors, like routing problems */
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (23 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 24/29] net-lwip: add TFTP_BLOCKSIZE Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  6:05   ` Ilias Apalodimas
  2024-10-04 18:25   ` Tom Rini
  2024-10-03 15:46 ` [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer Jerome Forissier
                   ` (6 subsequent siblings)
  31 siblings, 2 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Jiaxun Yang, Heinrich Schuchardt

Build and run qemu_arm64_lwip_defconfig in CI. This tests the lightweight
IP (lwIP) implementation of the dhcp, tftpboot and ping commands.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 .azure-pipelines.yml | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
index 93111eb6127..59fddb96a48 100644
--- a/.azure-pipelines.yml
+++ b/.azure-pipelines.yml
@@ -238,6 +238,10 @@ stages:
           cd \${WORK_DIR}
           git config --global --add safe.directory \${WORK_DIR}
           git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
+          # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
+          # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
+          ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
+          ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
           ln -s travis-ci /tmp/uboot-test-hooks/bin/\`hostname\`
           ln -s travis-ci /tmp/uboot-test-hooks/py/\`hostname\`
           grub-mkimage --prefix=\"\" -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
@@ -415,6 +419,9 @@ stages:
         qemu_arm64:
           TEST_PY_BD: "qemu_arm64"
           TEST_PY_TEST_SPEC: "not sleep"
+        qemu_arm64_lwip:
+          TEST_PY_BD: "qemu_arm64_lwip"
+          TEST_PY_TEST_SPEC: "test_net_dhcp or test_net_ping or test_net_tftpboot"
         qemu_m68k:
           TEST_PY_BD: "M5208EVBE"
           TEST_PY_ID: "--id qemu"
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (24 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-03 16:02   ` Ilias Apalodimas
  2024-10-03 15:46 ` [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig Jerome Forissier
                   ` (5 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass, Mattijs Korpershoek, Sumit Garg, Neil Armstrong,
	Caleb Connolly, Robert Marko, Sam Protsenko, Andrew Davis

Add myself as a maintainer for the lwIP network stack integration code
and network commands as well as the sandbox ethernet driver for lwIP.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 MAINTAINERS | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7ab39d91a55..27d6de67b21 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1352,6 +1352,17 @@ F:	drivers/net/
 F:	include/net.h
 F:	net/
 
+NETWORK (LWIP)
+M:	Jerome Forissier <jerome.forissier@linaro.org>
+S:	Maintained
+F:	cmd/net-lwip.c
+F:	configs/qemu_arm64_lwip_defconfig
+F:	drivers/net/sandbox-lwip.c
+F:	include/net-lwip.h
+F:	lib/lwip/Makefile
+F:	lib/lwip/u-boot/
+F:	net/lwip/
+
 NIOS
 M:	Thomas Chou <thomas@wytron.com.tw>
 S:	Maintained
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (25 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer Jerome Forissier
@ 2024-10-03 15:46 ` Jerome Forissier
  2024-10-04  6:01   ` Ilias Apalodimas
  2024-10-03 15:47 ` [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100 Jerome Forissier
                   ` (4 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:46 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Simon Glass

The tools-only defconfig causes troubles on MacOSX due to the default
C compiler being Clang (LLVM) rather than GCC and more specifically
due to [1]. Therefore replace "# CONFIG_FOO is not set" with the
equivalent "CONFIG_FOO=n" using the following command:

 $ sed -i -e 's/# \(CONFIG_[^ ]*\) is not set/\1=n/' \
       configs/tools-only_defconfig

This fixes the tools_only_macOS CI job on GitHub [2].

[1] https://github.com/llvm/llvm-project/issues/78778
[2] https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9105&view=results

Suggested-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
---
 configs/tools-only_defconfig | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/configs/tools-only_defconfig b/configs/tools-only_defconfig
index e00f2c48598..7511e30d709 100644
--- a/configs/tools-only_defconfig
+++ b/configs/tools-only_defconfig
@@ -4,26 +4,26 @@ CONFIG_ENV_SIZE=0x2000
 CONFIG_DEFAULT_DEVICE_TREE="sandbox"
 CONFIG_SYS_LOAD_ADDR=0x0
 CONFIG_PCI=y
-# CONFIG_SANDBOX_SDL is not set
+CONFIG_SANDBOX_SDL=n
 CONFIG_ANDROID_BOOT_IMAGE=y
 CONFIG_TIMESTAMP=y
 CONFIG_FIT=y
 CONFIG_FIT_SIGNATURE=y
-# CONFIG_BOOTSTD_FULL is not set
-# CONFIG_BOOTMETH_CROS is not set
-# CONFIG_BOOTMETH_VBE is not set
+CONFIG_BOOTSTD_FULL=n
+CONFIG_BOOTMETH_CROS=n
+CONFIG_BOOTMETH_VBE=n
 CONFIG_USE_BOOTCOMMAND=y
 CONFIG_BOOTCOMMAND="run distro_bootcmd"
-# CONFIG_CMD_BOOTD is not set
-# CONFIG_CMD_BOOTM is not set
-# CONFIG_CMD_BOOTI is not set
-# CONFIG_CMD_ELF is not set
-# CONFIG_CMD_EXTENSION is not set
-# CONFIG_CMD_DATE is not set
+CONFIG_CMD_BOOTD=n
+CONFIG_CMD_BOOTM=n
+CONFIG_CMD_BOOTI=n
+CONFIG_CMD_ELF=n
+CONFIG_CMD_EXTENSION=n
+CONFIG_CMD_DATE=n
 CONFIG_OF_CONTROL=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_NO_NET=y
-# CONFIG_ACPIGEN is not set
+CONFIG_ACPIGEN=n
 CONFIG_AXI=y
 CONFIG_AXI_SANDBOX=y
 CONFIG_SANDBOX_GPIO=y
@@ -32,9 +32,9 @@ CONFIG_DM_RTC=y
 CONFIG_SOUND=y
 CONFIG_SYSRESET=y
 CONFIG_TIMER=y
-# CONFIG_VIRTIO_MMIO is not set
-# CONFIG_VIRTIO_PCI is not set
-# CONFIG_VIRTIO_SANDBOX is not set
-# CONFIG_GENERATE_ACPI_TABLE is not set
-# CONFIG_EFI_LOADER is not set
+CONFIG_VIRTIO_MMIO=n
+CONFIG_VIRTIO_PCI=n
+CONFIG_VIRTIO_SANDBOX=n
+CONFIG_GENERATE_ACPI_TABLE=n
+CONFIG_EFI_LOADER=n
 CONFIG_TOOLS_MKEFICAPSULE=y
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (26 preceding siblings ...)
  2024-10-03 15:46 ` [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig Jerome Forissier
@ 2024-10-03 15:47 ` Jerome Forissier
  2024-10-04  6:05   ` Ilias Apalodimas
  2024-10-03 15:47 ` [PATCH v11 29/29] [TESTING] Kconfig: enable NET_LWIP by default Jerome Forissier
                   ` (3 subsequent siblings)
  31 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:47 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Chia-Wei Wang,
	Maxim Sloyko, Tom Rini

FTGMAC100 is not compatible with NET_LWIP which was enabled as the
default stack in a previous commit. So enable NET in the defconfig.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
---
 configs/evb-ast2500_defconfig | 1 +
 configs/evb-ast2600_defconfig | 1 +
 2 files changed, 2 insertions(+)

diff --git a/configs/evb-ast2500_defconfig b/configs/evb-ast2500_defconfig
index 6685f37e3f5..d20ccf16797 100644
--- a/configs/evb-ast2500_defconfig
+++ b/configs/evb-ast2500_defconfig
@@ -35,6 +35,7 @@ CONFIG_CMD_NCSI=y
 CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_NET=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_REGMAP=y
 CONFIG_CLK=y
diff --git a/configs/evb-ast2600_defconfig b/configs/evb-ast2600_defconfig
index e6a4e4d1b7c..47faf05a242 100644
--- a/configs/evb-ast2600_defconfig
+++ b/configs/evb-ast2600_defconfig
@@ -78,6 +78,7 @@ CONFIG_ENV_OVERWRITE=y
 CONFIG_ENV_IS_IN_SPI_FLASH=y
 CONFIG_ENV_SECT_SIZE_AUTO=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_NET=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_SPL_DM=y
 CONFIG_SPL_DM_SEQ_ALIAS=y
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* [PATCH v11 29/29] [TESTING] Kconfig: enable NET_LWIP by default
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (27 preceding siblings ...)
  2024-10-03 15:47 ` [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100 Jerome Forissier
@ 2024-10-03 15:47 ` Jerome Forissier
  2024-10-03 16:00 ` [PATCH v11 00/29] Introduce the lwIP network stack Ilias Apalodimas
                   ` (2 subsequent siblings)
  31 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 15:47 UTC (permalink / raw)
  To: u-boot
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Jerome Forissier, Tom Rini,
	Paul Kocialkowski, Simon Glass, Svyatoslav Ryhel, Paul Barker,
	Marek Vasut, Hiago De Franco, Greg Malysa

Enable NET_LWIP by default for testing purposes.

Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
---
 Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Kconfig b/Kconfig
index 9e3a55798f9..0ee281b4574 100644
--- a/Kconfig
+++ b/Kconfig
@@ -756,7 +756,7 @@ menu Networking
 
 choice
 	prompt "Networking stack"
-	default NET
+	default NET_LWIP
 
 config NO_NET
 	bool "No networking support"
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (28 preceding siblings ...)
  2024-10-03 15:47 ` [PATCH v11 29/29] [TESTING] Kconfig: enable NET_LWIP by default Jerome Forissier
@ 2024-10-03 16:00 ` Ilias Apalodimas
  2024-10-03 16:10   ` Jerome Forissier
  2024-10-04 18:30 ` Tom Rini
  2024-10-04 19:15 ` Tom Rini
  31 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-03 16:00 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov

Hi Jerome,

I'll have a look, but there seems to be reviewed-by and acked-by tags missing?
Any chance you lost those during rebasing ?

Thanks
/Ilias
On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
<jerome.forissier@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. and
> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE
>
> Notes
>
> 1. A number of features are currently incompatible with NET_LWIP:
> DFU_TFTP, FASTBOOT, SPL_NET, ETH_SANDBOX, ETH_SANDBOX_RAW, DM_ETH. They
> 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.
>
> 2. Due to the above, and in order to provide some level of testing of the
> lwIP code in CI even when the legacy NET is the default, a new QEMU
> configuration is introduced (qemu_arm64_lwip_defconfig) which is
> based on qemu_arm64_defconfig with NET_LWIP and CMD_*_LWIP enabled.
> In addition to that, this series has some [TESTING] patches
> which make NET_LWIP the default.
>
> [1] https://lore.kernel.org/all/20231127125726.3735-1-maxim.uvarov@linaro.org/
> [2] https://www.nongnu.org/lwip/
> [3] https://en.wikipedia.org/wiki/LwIP
>
> Changes in v11:
>
> - Rebased onto next
> - "Miscellaneous fixes" removed (patches were merged in next). The
> series still begins with small fixes posted separately [1] [2] [3].
> - Add (some) support for CMD_PXE and therefore drop patch "[TESTING]
> configs: set CONFIG_NET=y when PXE is enabled". This is build-tested
> only and it is very likely that some work is needed to make it useful.
> For example, adding the code for DHCP option 209 to lwIP so that
> BOOTP_PXE_DHCP_OPTION can be supported.
> - SANDBOX is now supported, but with the dm eth and wget tests
> disabled.
> - Move eth_set_enable_bootdevs() declaration to net-common.h
> Fixes warning with snow_defconfig:
> test/test-main.c:310:17: warning: implicit declaration of function ‘eth_set_enable_bootdevs’ [....]
> - Do eth_init() and eth_init_rings() only once, and do not forget
> lwip_init()! Fixes TFTP stalls on TI K3 (reported by Tom R. and
> tested by Ilias A.)
> - Set MEM_ALIGNMENT to 8 in lib/lwip/u-boot/lwipopts.h. Fixes TFTP
> random crashes on TI K3 (Ilias A.)
> - net_lwip_rx(): call free_pkt() even when recv() has returned 0,
> as required by the driver model documentation (and imx8mp_evk). Fixes
> a regression introduced in v9. Goes together with patch [2].
> - Add "lwip: tftp: bind to TFTP port only when in server mode" to
> fix an issue with interrupted tftp commands (the tftp command hangs
> if it is interrupted with Ctrl-C and started again).
> - TFTP: fix uninitialized "ret" variable in do_tftpb(); print "Abort"
> on Ctrl-C.
> - MAINTAINERS: remove README and add sandbox ethernet driver to the
> list of maintained files.
> - AFAICT, CI should be all good except qemu_xtensa_dc233c which is
> broken when NET_LWIP=y (QEMU just hangs with no output). I could
> not find or build a suitable GDB binary to debug that.
>
> [1] https://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
> [2] https://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/
> [3] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>
> Changes in v10:
>
> - Rebase onto next
> - URL for lwIP changed in cover letter: using GitHub now since all
> tags have suddenly disappeared from the repository on gnu.org.
> - Post fixes as a separate series [1] or individual patches [2] [3]
> - Add "if NET_LWIP" to net/lwip/Kconfig to fix a kconfig warning
>   when doing the full branch build with buildman ("[NEW]")
> - net/ is added to libs-y only when NET or NET_LWIP, not NO_NET
> - Apply review tags
>
> [1] http://patchwork.ozlabs.org/project/uboot/list/?series=422079
> https://lists.denx.de/pipermail/u-boot/2024-September/563904.html
> [2] http://patchwork.ozlabs.org/project/uboot/list/?series=421962
> [3] http://patchwork.ozlabs.org/project/uboot/list/?series=421959
>
> Changes in v9:
>
> - Rebased onto master, reordered commits to put some fixes that are not
> strictly related to lwIP first.
> - New commit "test/py: test_efi_loader: add missing dependency on
> cmd_tftpboot" (Tom R.)
> - test_efi_loader.py: add missing dependency on cmd_wget (Tom R.)
> - wget: fix divide by zero when transfer takes less than 1ms (Tom R.)
> - New commit "configs: use syntax CONFIG_FOO=n in tools-only_defconfig"
> (Tom R.)
> - Make TCP_WND configurable (via CONFIG_LWIP_TCP_WND) because a large
> value is needed for good performance especially with latency but
> transfers stall in QEMU (-net user) when the value is larger than a few
> KB (Anton A., offlist)
> - Added [TESTING] commits to run CI with NET_LWIP enabled by default
> except for SANDBOX and platforms that enable PXE, and fixed a number of
> issues:
>   * coreboot_defconfig: 'implicit declaration' warnings on
>     ip_checksum_ok() and compute_ip_checksum()
>   * Fix EFI net tests (bootefi selftest) by adding missing
>     push_packed() call to net_process_received_packet()
>   * qemu_arm64: fix test_efi_loader.py failures (skip HTTP test
>     by default since it needs a HTTP server; fix a bug in the dhcp
>     command which would not set the "serverip" variable)
>   * QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139:
>     Fixed receive errors due to calling free_pkt() with a
>     length of zero. r2dplus_tulip: fixed "dm_pci_phys_to_bus:
>     invalid physical address" caused by too late eth_init_rings().
> With that the CI status is all GREEN:
> https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9225&view=results
>
> Changes in v8:
>
> - Fix bootefi with tftp and wget. It would previously fail with an
> error message: "No UEFI binary known at 200000". Tested on Raspberry
> 3B+. Also fix the legacy wget. (Tom R.)
> - wget: add "Bytes transferred =" message and accept legacy syntax
> for better compatibility which also makes it easier to add a test to
> the test suite
> - wget: When no server name or address is supplied, use
> ${httpserverip} then ${serverip}.
> - wget: start the timer used for measuring throughput when the first
> data block is received. In other words: do not include DNS resolution
> and TCP connection time in measurement. It gives better numbers ;)
> but more importantly is how the legacy code works.
> - wget: handle non-200 result codes from the server as errors.
> - tftp: when no server name or ip is supplied, use ${tftpserverip}
> then fall back to ${serverip}.
> - New commit: "test/py: add HTTP (wget) test"
> - New commit: "net: wget: removed unused function wget_success()"
> - Change back all !CONFIG_IS_ENABLED(NO_NET) tests to
> (CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)) since the
> NO_NET case is wrong when CONFIG_SPL_BUILD or CONFIG_TPL_BUILD is
> defined (Tom R.)
>
> Changes in v7:
>
> - Rebased onto master
> - Updated binary size comparisons in this cover letter. Note that
> the increase for imx8mp_evk_defconfig  was wrong due to a configuration
> error.
>
> Changes in v6:
>
> - Rebased on next
> - "flash: prefix error codes with FL_"
> Update drivers/mtd/altera_qspi.c too (Tom R.)
> - "net: introduce alternative implementation as net-lwip/"
> Introduce a "Networking" top-level menu in the main Kconfig. Avoids
> having a lot of network-related symbols on the first screen of
> menuconfig. The "Networking stack" choice as well as the applicable
> symbols (depending on the selected choice) are now all inside this
> "Networking" menu. (Michal S.)
> For PROT_DHCP_LWIP and PROT_DNS_LWIP, use "select" PROT_UDP_LWIP
> rather than "depends on".
> Move NET_RANDOM_ETHADDR to the common ('if NET || NET_LWIP') block.
> Move SYS_RX_ETH_BUFFER out of 'if NET || NET_LWIP' since it is used
> unguarded in some code (e.g., am62x_beagleplay_r5) (Tom R.).
> - "net: split include/net.h into net{,-common,-legacy,-lwip}.h"
> Move net_random_ethaddr() to net-common.h.
> - "net: eth-uclass: add function eth_start_udev()"
> Fix typo and apply Tom R.'s R-b.
> - "net-lwip: add DHCP support and dhcp commmand"
> Convert !CONFIG_IS_ENABLED(NET) to
> CONFIG_IS_ENABLED(NO_NET) in board/xilinx/common/board.c
> to fix an issue with device having no MAC address (thanks Michal S.).
> Do the same at other places (icore_mx8mp.c, imx8mp_debix_model_a.c,
> board/ti/am335x/board.c, tiny-printf.c).
> Move CMD_MII and CMD_MDIO into 'if NET || NET_LWIP'.
> - "net-lwip: add TFTP support and tftpboot command":
> Fix help string.
> - "net: split cmd/net.c into cmd/net.c and cmd/net-common.c":
> Apply Ilias' R-b.
> - "net-lwip: add TFTP_BLOCKSIZE"
> Apply Ilias' R-b. I moved the TFTP_BLOCKSIZE Kconfig into this commit
> where it belongs (it was previously in "net" split ... net.h").
>
> Changes in v5:
>
> - Rebased on next
> - Refactor Kconfig options to avoid duplicates
> - Library functions use a more consistent naming (dhcp_loop(),
> ping_loop() etc.) and take a struct udevice * parameter (Heinrich S.)
> - Do not use net_process_receive_packet() for input anymore. Instead of
> calling eth_rx() which would invoke net_process_receive_packet(), we
> call a new net_lwip_rx(udev) function which invokes the device recv()
> and pushes the packets up the lwIP stack. Thus everything is tied to
> a udevice now. (Heinrich S.)
> - Add "configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y"
> (Tom R.)
> - tftp: unify display with legacy command: add throughput, 65 hashes per
> line, one every 10 blocks received (Tom R.)
> - Moved net-lwip/* to net/lwip/* (Simon G.)
> - Rename static function low_level_output() to linkoutput() since it is
> the name used in the lwIP netif struct.
> - Fixed off-by-one in parse_url() which could cause wget to fail when
> passed a URL with a host name (as opposed to a URL with an IP address).
> - Improved TFTP performance by adding support for the blksize option
> (patches "lwip: tftp: add support of blksize option to client" and
> "net-lwip: add TFTP_BLOCKSIZE) (Tom R.)
> - Add an optional port number to the tftp command for easier testing
> (syntax: tftp [[ip:[port:]]filename])
> - wget: display an "unsupported URI" error if uri is not http://
> (Jon H.)
> - Adjusted the lwIP TCP options in lib/lwip/u-boot/lwipopts.h for
> better performance, in particular TCP_WND.
> - Add "net: fec_mxc_init(): do not ignore return status of fec_open()"
> - Set the proper environment variables when DHCP succeeds (ipaddr%d
> etc.) and read the proper ones for the given device in new_netif(),
> allowing correct behavior when several adapters are available (tested
> on i.MX8M Plus).
> - Fix an alignment issue with outgoing packets (see the linkoutput()
> function). With that the i.MX8M Plus ENET1 interface works properly.
> (reported by Tim H.).
> - Add review tags
>
> 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.
>
>
> Jerome Forissier (28):
>   net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
>   Make AVB_VERIFY depend on FASTBOOT
>   linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
>   sandbox: add dummy driver ETH_SANDBOX_LWIP
>   test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
>   test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
>   net: introduce alternative implementation as net-lwip/
>   configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y
>   net: split include/net.h into net{,-common,-legacy,-lwip}.h
>   net: move copy_filename() to new file net/net-common.c
>   net: eth-uclass: add function eth_start_udev()
>   net-lwip: build lwIP
>   net-lwip: add DHCP support and dhcp commmand
>   lwip: tftp: bind to TFTP port only when in server mode
>   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
>   lwip: tftp: add support of blksize option to client
>   net-lwip: add TFTP_BLOCKSIZE
>   CI: add qemu_arm64_lwip to the test matrix
>   MAINTAINERS: net-lwip: add myself as a maintainer
>   configs: use syntax CONFIG_FOO=n in tools-only_defconfig
>   [TESTING] configs: set CONFIG_NET=y for FTGMAC100
>   [TESTING] Kconfig: enable NET_LWIP by default
>
> Jonathan Humphreys (1):
>   net-lwip: lwIP wget supports user defined port in the uri, so allow
>     it.
>
>  .azure-pipelines.yml                          |   7 +
>  Kconfig                                       |  29 +
>  MAINTAINERS                                   |  11 +
>  Makefile                                      |   6 +-
>  arch/Kconfig                                  |   2 +-
>  board/engicam/imx8mp/icore_mx8mp.c            |   2 +-
>  .../imx8mp_debix_model_a.c                    |   2 +-
>  board/ti/am335x/board.c                       |   3 +-
>  board/xilinx/common/board.c                   |   3 +-
>  boot/Kconfig                                  |   4 +-
>  cmd/Kconfig                                   | 140 +--
>  cmd/Makefile                                  |   9 +-
>  cmd/bdinfo.c                                  |   5 +-
>  cmd/elf.c                                     |   2 +-
>  cmd/net-common.c                              | 109 ++
>  cmd/net-lwip.c                                |  45 +
>  cmd/net.c                                     | 115 ---
>  common/Kconfig                                |   3 +-
>  common/board_r.c                              |   4 +-
>  common/spl/Kconfig                            |   1 +
>  common/usb_kbd.c                              |   2 +-
>  configs/LicheePi_Zero_defconfig               |   2 +-
>  configs/M5249EVB_defconfig                    |   2 +-
>  configs/am335x_pdu001_defconfig               |   2 +-
>  configs/am62ax_evm_r5_defconfig               |   2 +-
>  configs/am62px_evm_r5_defconfig               |   2 +-
>  configs/am62x_beagleplay_r5_defconfig         |   2 +-
>  configs/amcore_defconfig                      |   2 +-
>  configs/amd_versal2_mini_defconfig            |   2 +-
>  configs/amd_versal2_mini_emmc_defconfig       |   2 +-
>  configs/amd_versal2_mini_ospi_defconfig       |   2 +-
>  configs/amd_versal2_mini_qspi_defconfig       |   2 +-
>  configs/anbernic-rgxx3-rk3566_defconfig       |   2 +-
>  configs/ap143_defconfig                       |   2 +-
>  configs/ap152_defconfig                       |   2 +-
>  configs/apple_m1_defconfig                    |   2 +-
>  configs/astro_mcf5373l_defconfig              |   2 +-
>  configs/at91sam9rlek_dataflash_defconfig      |   2 +-
>  configs/at91sam9rlek_mmc_defconfig            |   2 +-
>  configs/at91sam9rlek_nandflash_defconfig      |   2 +-
>  configs/bcm7260_defconfig                     |   2 +-
>  configs/bcm7445_defconfig                     |   2 +-
>  configs/bcm968380gerg_ram_defconfig           |   2 +-
>  configs/bcmns_defconfig                       |   2 +-
>  configs/chromebook_samus_tpl_defconfig        |   2 +-
>  configs/cortina_presidio-asic-base_defconfig  |   2 +-
>  configs/cortina_presidio-asic-pnand_defconfig |   2 +-
>  configs/durian_defconfig                      |   2 +-
>  configs/e850-96_defconfig                     |   2 +-
>  configs/ea-lpc3250devkitv2_defconfig          |   2 +-
>  configs/efi-x86_app32_defconfig               |   2 +-
>  configs/efi-x86_app64_defconfig               |   2 +-
>  configs/emsdp_defconfig                       |   2 +-
>  configs/evb-ast2500_defconfig                 |   1 +
>  configs/evb-ast2600_defconfig                 |   1 +
>  configs/evb-px5_defconfig                     |   2 +-
>  configs/generic-rk3568_defconfig              |   2 +-
>  configs/generic-rk3588_defconfig              |   2 +-
>  configs/hc2910_2aghd05_defconfig              |   2 +-
>  configs/igep00x0_defconfig                    |   2 +-
>  configs/imx6q_bosch_acc_defconfig             |   2 +-
>  configs/imx6ulz_smm_m2_defconfig              |   2 +-
>  configs/iot_devkit_defconfig                  |   2 +-
>  configs/j722s_evm_r5_defconfig                |   2 +-
>  configs/legoev3_defconfig                     |   2 +-
>  configs/mk808_defconfig                       |   2 +-
>  configs/mx23evk_defconfig                     |   2 +-
>  configs/mx28evk_defconfig                     |   2 +-
>  configs/mx6memcal_defconfig                   |   2 +-
>  configs/mx6ulz_14x14_evk_defconfig            |   2 +-
>  configs/mx7ulp_com_defconfig                  |   2 +-
>  configs/mx7ulp_evk_defconfig                  |   2 +-
>  configs/mx7ulp_evk_plugin_defconfig           |   2 +-
>  configs/netgear_cg3100d_ram_defconfig         |   2 +-
>  configs/nsim_700_defconfig                    |   2 +-
>  configs/nsim_700be_defconfig                  |   2 +-
>  configs/nsim_hs38be_defconfig                 |   2 +-
>  configs/openpiton_riscv64_defconfig           |   2 +-
>  configs/openpiton_riscv64_spl_defconfig       |   2 +-
>  configs/origen_defconfig                      |   2 +-
>  configs/pe2201_defconfig                      |   2 +-
>  configs/pinecube_defconfig                    |   2 +-
>  configs/pm9261_defconfig                      |   2 +-
>  configs/qemu_arm64_lwip_defconfig             |   9 +
>  configs/s5p4418_nanopi2_defconfig             |   2 +-
>  configs/s5p_goni_defconfig                    |   2 +-
>  configs/s5pc210_universal_defconfig           |   2 +-
>  configs/sama5d27_giantboard_defconfig         |   2 +-
>  configs/sama5d29_curiosity_mmc1_defconfig     |   2 +-
>  configs/sama5d29_curiosity_mmc_defconfig      |   2 +-
>  .../sama5d29_curiosity_qspiflash_defconfig    |   2 +-
>  configs/sama7g54_curiosity_mmc_defconfig      |   2 +-
>  .../sama7g54_curiosity_nandflash_defconfig    |   2 +-
>  .../sama7g54_curiosity_qspiflash_defconfig    |   2 +-
>  configs/sipeed_maix_bitm_defconfig            |   2 +-
>  configs/sipeed_maix_smode_defconfig           |   2 +-
>  configs/stemmy_defconfig                      |   2 +-
>  configs/stm32f429-discovery_defconfig         |   2 +-
>  configs/stm32f429-evaluation_defconfig        |   2 +-
>  configs/stm32f469-discovery_defconfig         |   2 +-
>  configs/stm32h743-disco_defconfig             |   2 +-
>  configs/stm32h743-eval_defconfig              |   2 +-
>  configs/stm32h750-art-pi_defconfig            |   2 +-
>  configs/stm32mp25_defconfig                   |   2 +-
>  configs/stmark2_defconfig                     |   2 +-
>  configs/th1520_lpi4a_defconfig                |   2 +-
>  configs/thunderx_88xx_defconfig               |   2 +-
>  configs/tools-only_defconfig                  |  34 +-
>  configs/topic_miami_defconfig                 |   2 +-
>  configs/topic_miamilite_defconfig             |   2 +-
>  configs/topic_miamiplus_defconfig             |   2 +-
>  configs/total_compute_defconfig               |   2 +-
>  configs/trats2_defconfig                      |   2 +-
>  configs/trats_defconfig                       |   2 +-
>  configs/xenguest_arm64_defconfig              |   2 +-
>  configs/xenguest_arm64_virtio_defconfig       |   2 +-
>  configs/xilinx_versal_mini_defconfig          |   2 +-
>  configs/xilinx_versal_mini_emmc0_defconfig    |   2 +-
>  configs/xilinx_versal_mini_emmc1_defconfig    |   2 +-
>  configs/xilinx_versal_mini_ospi_defconfig     |   2 +-
>  configs/xilinx_versal_mini_qspi_defconfig     |   2 +-
>  configs/xilinx_versal_net_mini_defconfig      |   2 +-
>  configs/xilinx_versal_net_mini_emmc_defconfig |   2 +-
>  configs/xilinx_versal_net_mini_ospi_defconfig |   2 +-
>  configs/xilinx_versal_net_mini_qspi_defconfig |   2 +-
>  configs/xilinx_zynqmp_mini_defconfig          |   2 +-
>  configs/xilinx_zynqmp_mini_emmc0_defconfig    |   2 +-
>  configs/xilinx_zynqmp_mini_emmc1_defconfig    |   2 +-
>  configs/xilinx_zynqmp_mini_nand_defconfig     |   2 +-
>  .../xilinx_zynqmp_mini_nand_single_defconfig  |   2 +-
>  configs/xilinx_zynqmp_mini_qspi_defconfig     |   2 +-
>  configs/zynq_cse_nand_defconfig               |   2 +-
>  configs/zynq_cse_nor_defconfig                |   2 +-
>  configs/zynq_cse_qspi_defconfig               |   2 +-
>  drivers/dfu/Kconfig                           |   1 +
>  drivers/fastboot/Kconfig                      |   1 +
>  drivers/net/Kconfig                           |  16 +-
>  drivers/net/Makefile                          |   1 +
>  drivers/net/eepro100.c                        |   2 +-
>  drivers/net/phy/Kconfig                       |   2 +-
>  drivers/net/rtl8139.c                         |   2 +-
>  drivers/net/sandbox-lwip.c                    |  85 ++
>  drivers/usb/gadget/Kconfig                    |   2 +-
>  include/net-common.h                          | 509 ++++++++++
>  include/net-legacy.h                          | 541 ++++++++++
>  include/net-lwip.h                            |  41 +
>  include/net.h                                 | 943 +-----------------
>  lib/Makefile                                  |   2 +
>  lib/binman.c                                  |   1 +
>  lib/lwip/Makefile                             |  55 +
>  lib/lwip/lwip/src/apps/tftp/tftp.c            | 104 +-
>  .../lwip/src/include/lwip/apps/tftp_client.h  |   1 +
>  lib/lwip/u-boot/arch/cc.h                     |  45 +
>  lib/lwip/u-boot/arch/sys_arch.h               |   0
>  lib/lwip/u-boot/limits.h                      |   0
>  lib/lwip/u-boot/lwipopts.h                    | 157 +++
>  lib/tiny-printf.c                             |   3 +-
>  net/Kconfig                                   |  81 +-
>  net/Makefile                                  |  20 +-
>  net/eth-uclass.c                              |  38 +-
>  net/lwip/Kconfig                              |  49 +
>  net/lwip/Makefile                             |   8 +
>  net/lwip/dhcp.c                               | 136 +++
>  net/lwip/dns.c                                | 127 +++
>  net/lwip/eth_internal.h                       |  35 +
>  net/lwip/net-lwip.c                           | 307 ++++++
>  net/lwip/ping.c                               | 177 ++++
>  net/lwip/tftp.c                               | 290 ++++++
>  net/lwip/wget.c                               | 357 +++++++
>  net/net-common.c                              |  13 +
>  net/net.c                                     |  12 -
>  test/boot/bootdev.c                           |  11 +-
>  test/boot/bootflow.c                          |   7 +-
>  test/cmd/Makefile                             |   2 +
>  test/dm/Makefile                              |   2 +
>  175 files changed, 3607 insertions(+), 1346 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 drivers/net/sandbox-lwip.c
>  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
>  create mode 100644 net/net-common.c
>
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer
  2024-10-03 15:46 ` [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer Jerome Forissier
@ 2024-10-03 16:02   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-03 16:02 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Simon Glass, Mattijs Korpershoek,
	Sumit Garg, Neil Armstrong, Caleb Connolly, Robert Marko,
	Sam Protsenko, Andrew Davis

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Add myself as a maintainer for the lwIP network stack integration code
> and network commands as well as the sandbox ethernet driver for lwIP.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  MAINTAINERS | 11 +++++++++++
>  1 file changed, 11 insertions(+)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 7ab39d91a55..27d6de67b21 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1352,6 +1352,17 @@ F:       drivers/net/
>  F:     include/net.h
>  F:     net/
>
> +NETWORK (LWIP)
> +M:     Jerome Forissier <jerome.forissier@linaro.org>
> +S:     Maintained
> +F:     cmd/net-lwip.c
> +F:     configs/qemu_arm64_lwip_defconfig
> +F:     drivers/net/sandbox-lwip.c
> +F:     include/net-lwip.h
> +F:     lib/lwip/Makefile
> +F:     lib/lwip/u-boot/
> +F:     net/lwip/
> +
>  NIOS
>  M:     Thomas Chou <thomas@wytron.com.tw>
>  S:     Maintained
> --
> 2.40.1
>

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-03 16:00 ` [PATCH v11 00/29] Introduce the lwIP network stack Ilias Apalodimas
@ 2024-10-03 16:10   ` Jerome Forissier
  2024-10-03 16:11     ` Ilias Apalodimas
  0 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-03 16:10 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov



On 10/3/24 18:00, Ilias Apalodimas wrote:
> Hi Jerome,
> 
> I'll have a look, but there seems to be reviewed-by and acked-by tags missing?
> Any chance you lost those during rebasing ?

I only dropped your R-b from the MAINTAINERS patch because I changed it slightly.
Now I see you Acked it so that's good :) 

-- 
Jerome

> 
> Thanks
> /Ilias
> On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
> <jerome.forissier@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. and
>> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE
>>
>> Notes
>>
>> 1. A number of features are currently incompatible with NET_LWIP:
>> DFU_TFTP, FASTBOOT, SPL_NET, ETH_SANDBOX, ETH_SANDBOX_RAW, DM_ETH. They
>> 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.
>>
>> 2. Due to the above, and in order to provide some level of testing of the
>> lwIP code in CI even when the legacy NET is the default, a new QEMU
>> configuration is introduced (qemu_arm64_lwip_defconfig) which is
>> based on qemu_arm64_defconfig with NET_LWIP and CMD_*_LWIP enabled.
>> In addition to that, this series has some [TESTING] patches
>> which make NET_LWIP the default.
>>
>> [1] https://lore.kernel.org/all/20231127125726.3735-1-maxim.uvarov@linaro.org/
>> [2] https://www.nongnu.org/lwip/
>> [3] https://en.wikipedia.org/wiki/LwIP
>>
>> Changes in v11:
>>
>> - Rebased onto next
>> - "Miscellaneous fixes" removed (patches were merged in next). The
>> series still begins with small fixes posted separately [1] [2] [3].
>> - Add (some) support for CMD_PXE and therefore drop patch "[TESTING]
>> configs: set CONFIG_NET=y when PXE is enabled". This is build-tested
>> only and it is very likely that some work is needed to make it useful.
>> For example, adding the code for DHCP option 209 to lwIP so that
>> BOOTP_PXE_DHCP_OPTION can be supported.
>> - SANDBOX is now supported, but with the dm eth and wget tests
>> disabled.
>> - Move eth_set_enable_bootdevs() declaration to net-common.h
>> Fixes warning with snow_defconfig:
>> test/test-main.c:310:17: warning: implicit declaration of function ‘eth_set_enable_bootdevs’ [....]
>> - Do eth_init() and eth_init_rings() only once, and do not forget
>> lwip_init()! Fixes TFTP stalls on TI K3 (reported by Tom R. and
>> tested by Ilias A.)
>> - Set MEM_ALIGNMENT to 8 in lib/lwip/u-boot/lwipopts.h. Fixes TFTP
>> random crashes on TI K3 (Ilias A.)
>> - net_lwip_rx(): call free_pkt() even when recv() has returned 0,
>> as required by the driver model documentation (and imx8mp_evk). Fixes
>> a regression introduced in v9. Goes together with patch [2].
>> - Add "lwip: tftp: bind to TFTP port only when in server mode" to
>> fix an issue with interrupted tftp commands (the tftp command hangs
>> if it is interrupted with Ctrl-C and started again).
>> - TFTP: fix uninitialized "ret" variable in do_tftpb(); print "Abort"
>> on Ctrl-C.
>> - MAINTAINERS: remove README and add sandbox ethernet driver to the
>> list of maintained files.
>> - AFAICT, CI should be all good except qemu_xtensa_dc233c which is
>> broken when NET_LWIP=y (QEMU just hangs with no output). I could
>> not find or build a suitable GDB binary to debug that.
>>
>> [1] https://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
>> [2] https://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/
>> [3] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>>
>> Changes in v10:
>>
>> - Rebase onto next
>> - URL for lwIP changed in cover letter: using GitHub now since all
>> tags have suddenly disappeared from the repository on gnu.org.
>> - Post fixes as a separate series [1] or individual patches [2] [3]
>> - Add "if NET_LWIP" to net/lwip/Kconfig to fix a kconfig warning
>>   when doing the full branch build with buildman ("[NEW]")
>> - net/ is added to libs-y only when NET or NET_LWIP, not NO_NET
>> - Apply review tags
>>
>> [1] http://patchwork.ozlabs.org/project/uboot/list/?series=422079
>> https://lists.denx.de/pipermail/u-boot/2024-September/563904.html
>> [2] http://patchwork.ozlabs.org/project/uboot/list/?series=421962
>> [3] http://patchwork.ozlabs.org/project/uboot/list/?series=421959
>>
>> Changes in v9:
>>
>> - Rebased onto master, reordered commits to put some fixes that are not
>> strictly related to lwIP first.
>> - New commit "test/py: test_efi_loader: add missing dependency on
>> cmd_tftpboot" (Tom R.)
>> - test_efi_loader.py: add missing dependency on cmd_wget (Tom R.)
>> - wget: fix divide by zero when transfer takes less than 1ms (Tom R.)
>> - New commit "configs: use syntax CONFIG_FOO=n in tools-only_defconfig"
>> (Tom R.)
>> - Make TCP_WND configurable (via CONFIG_LWIP_TCP_WND) because a large
>> value is needed for good performance especially with latency but
>> transfers stall in QEMU (-net user) when the value is larger than a few
>> KB (Anton A., offlist)
>> - Added [TESTING] commits to run CI with NET_LWIP enabled by default
>> except for SANDBOX and platforms that enable PXE, and fixed a number of
>> issues:
>>   * coreboot_defconfig: 'implicit declaration' warnings on
>>     ip_checksum_ok() and compute_ip_checksum()
>>   * Fix EFI net tests (bootefi selftest) by adding missing
>>     push_packed() call to net_process_received_packet()
>>   * qemu_arm64: fix test_efi_loader.py failures (skip HTTP test
>>     by default since it needs a HTTP server; fix a bug in the dhcp
>>     command which would not set the "serverip" variable)
>>   * QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139:
>>     Fixed receive errors due to calling free_pkt() with a
>>     length of zero. r2dplus_tulip: fixed "dm_pci_phys_to_bus:
>>     invalid physical address" caused by too late eth_init_rings().
>> With that the CI status is all GREEN:
>> https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9225&view=results
>>
>> Changes in v8:
>>
>> - Fix bootefi with tftp and wget. It would previously fail with an
>> error message: "No UEFI binary known at 200000". Tested on Raspberry
>> 3B+. Also fix the legacy wget. (Tom R.)
>> - wget: add "Bytes transferred =" message and accept legacy syntax
>> for better compatibility which also makes it easier to add a test to
>> the test suite
>> - wget: When no server name or address is supplied, use
>> ${httpserverip} then ${serverip}.
>> - wget: start the timer used for measuring throughput when the first
>> data block is received. In other words: do not include DNS resolution
>> and TCP connection time in measurement. It gives better numbers ;)
>> but more importantly is how the legacy code works.
>> - wget: handle non-200 result codes from the server as errors.
>> - tftp: when no server name or ip is supplied, use ${tftpserverip}
>> then fall back to ${serverip}.
>> - New commit: "test/py: add HTTP (wget) test"
>> - New commit: "net: wget: removed unused function wget_success()"
>> - Change back all !CONFIG_IS_ENABLED(NO_NET) tests to
>> (CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)) since the
>> NO_NET case is wrong when CONFIG_SPL_BUILD or CONFIG_TPL_BUILD is
>> defined (Tom R.)
>>
>> Changes in v7:
>>
>> - Rebased onto master
>> - Updated binary size comparisons in this cover letter. Note that
>> the increase for imx8mp_evk_defconfig  was wrong due to a configuration
>> error.
>>
>> Changes in v6:
>>
>> - Rebased on next
>> - "flash: prefix error codes with FL_"
>> Update drivers/mtd/altera_qspi.c too (Tom R.)
>> - "net: introduce alternative implementation as net-lwip/"
>> Introduce a "Networking" top-level menu in the main Kconfig. Avoids
>> having a lot of network-related symbols on the first screen of
>> menuconfig. The "Networking stack" choice as well as the applicable
>> symbols (depending on the selected choice) are now all inside this
>> "Networking" menu. (Michal S.)
>> For PROT_DHCP_LWIP and PROT_DNS_LWIP, use "select" PROT_UDP_LWIP
>> rather than "depends on".
>> Move NET_RANDOM_ETHADDR to the common ('if NET || NET_LWIP') block.
>> Move SYS_RX_ETH_BUFFER out of 'if NET || NET_LWIP' since it is used
>> unguarded in some code (e.g., am62x_beagleplay_r5) (Tom R.).
>> - "net: split include/net.h into net{,-common,-legacy,-lwip}.h"
>> Move net_random_ethaddr() to net-common.h.
>> - "net: eth-uclass: add function eth_start_udev()"
>> Fix typo and apply Tom R.'s R-b.
>> - "net-lwip: add DHCP support and dhcp commmand"
>> Convert !CONFIG_IS_ENABLED(NET) to
>> CONFIG_IS_ENABLED(NO_NET) in board/xilinx/common/board.c
>> to fix an issue with device having no MAC address (thanks Michal S.).
>> Do the same at other places (icore_mx8mp.c, imx8mp_debix_model_a.c,
>> board/ti/am335x/board.c, tiny-printf.c).
>> Move CMD_MII and CMD_MDIO into 'if NET || NET_LWIP'.
>> - "net-lwip: add TFTP support and tftpboot command":
>> Fix help string.
>> - "net: split cmd/net.c into cmd/net.c and cmd/net-common.c":
>> Apply Ilias' R-b.
>> - "net-lwip: add TFTP_BLOCKSIZE"
>> Apply Ilias' R-b. I moved the TFTP_BLOCKSIZE Kconfig into this commit
>> where it belongs (it was previously in "net" split ... net.h").
>>
>> Changes in v5:
>>
>> - Rebased on next
>> - Refactor Kconfig options to avoid duplicates
>> - Library functions use a more consistent naming (dhcp_loop(),
>> ping_loop() etc.) and take a struct udevice * parameter (Heinrich S.)
>> - Do not use net_process_receive_packet() for input anymore. Instead of
>> calling eth_rx() which would invoke net_process_receive_packet(), we
>> call a new net_lwip_rx(udev) function which invokes the device recv()
>> and pushes the packets up the lwIP stack. Thus everything is tied to
>> a udevice now. (Heinrich S.)
>> - Add "configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y"
>> (Tom R.)
>> - tftp: unify display with legacy command: add throughput, 65 hashes per
>> line, one every 10 blocks received (Tom R.)
>> - Moved net-lwip/* to net/lwip/* (Simon G.)
>> - Rename static function low_level_output() to linkoutput() since it is
>> the name used in the lwIP netif struct.
>> - Fixed off-by-one in parse_url() which could cause wget to fail when
>> passed a URL with a host name (as opposed to a URL with an IP address).
>> - Improved TFTP performance by adding support for the blksize option
>> (patches "lwip: tftp: add support of blksize option to client" and
>> "net-lwip: add TFTP_BLOCKSIZE) (Tom R.)
>> - Add an optional port number to the tftp command for easier testing
>> (syntax: tftp [[ip:[port:]]filename])
>> - wget: display an "unsupported URI" error if uri is not http://
>> (Jon H.)
>> - Adjusted the lwIP TCP options in lib/lwip/u-boot/lwipopts.h for
>> better performance, in particular TCP_WND.
>> - Add "net: fec_mxc_init(): do not ignore return status of fec_open()"
>> - Set the proper environment variables when DHCP succeeds (ipaddr%d
>> etc.) and read the proper ones for the given device in new_netif(),
>> allowing correct behavior when several adapters are available (tested
>> on i.MX8M Plus).
>> - Fix an alignment issue with outgoing packets (see the linkoutput()
>> function). With that the i.MX8M Plus ENET1 interface works properly.
>> (reported by Tim H.).
>> - Add review tags
>>
>> 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.
>>
>>
>> Jerome Forissier (28):
>>   net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
>>   Make AVB_VERIFY depend on FASTBOOT
>>   linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
>>   sandbox: add dummy driver ETH_SANDBOX_LWIP
>>   test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
>>   test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
>>   net: introduce alternative implementation as net-lwip/
>>   configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y
>>   net: split include/net.h into net{,-common,-legacy,-lwip}.h
>>   net: move copy_filename() to new file net/net-common.c
>>   net: eth-uclass: add function eth_start_udev()
>>   net-lwip: build lwIP
>>   net-lwip: add DHCP support and dhcp commmand
>>   lwip: tftp: bind to TFTP port only when in server mode
>>   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
>>   lwip: tftp: add support of blksize option to client
>>   net-lwip: add TFTP_BLOCKSIZE
>>   CI: add qemu_arm64_lwip to the test matrix
>>   MAINTAINERS: net-lwip: add myself as a maintainer
>>   configs: use syntax CONFIG_FOO=n in tools-only_defconfig
>>   [TESTING] configs: set CONFIG_NET=y for FTGMAC100
>>   [TESTING] Kconfig: enable NET_LWIP by default
>>
>> Jonathan Humphreys (1):
>>   net-lwip: lwIP wget supports user defined port in the uri, so allow
>>     it.
>>
>>  .azure-pipelines.yml                          |   7 +
>>  Kconfig                                       |  29 +
>>  MAINTAINERS                                   |  11 +
>>  Makefile                                      |   6 +-
>>  arch/Kconfig                                  |   2 +-
>>  board/engicam/imx8mp/icore_mx8mp.c            |   2 +-
>>  .../imx8mp_debix_model_a.c                    |   2 +-
>>  board/ti/am335x/board.c                       |   3 +-
>>  board/xilinx/common/board.c                   |   3 +-
>>  boot/Kconfig                                  |   4 +-
>>  cmd/Kconfig                                   | 140 +--
>>  cmd/Makefile                                  |   9 +-
>>  cmd/bdinfo.c                                  |   5 +-
>>  cmd/elf.c                                     |   2 +-
>>  cmd/net-common.c                              | 109 ++
>>  cmd/net-lwip.c                                |  45 +
>>  cmd/net.c                                     | 115 ---
>>  common/Kconfig                                |   3 +-
>>  common/board_r.c                              |   4 +-
>>  common/spl/Kconfig                            |   1 +
>>  common/usb_kbd.c                              |   2 +-
>>  configs/LicheePi_Zero_defconfig               |   2 +-
>>  configs/M5249EVB_defconfig                    |   2 +-
>>  configs/am335x_pdu001_defconfig               |   2 +-
>>  configs/am62ax_evm_r5_defconfig               |   2 +-
>>  configs/am62px_evm_r5_defconfig               |   2 +-
>>  configs/am62x_beagleplay_r5_defconfig         |   2 +-
>>  configs/amcore_defconfig                      |   2 +-
>>  configs/amd_versal2_mini_defconfig            |   2 +-
>>  configs/amd_versal2_mini_emmc_defconfig       |   2 +-
>>  configs/amd_versal2_mini_ospi_defconfig       |   2 +-
>>  configs/amd_versal2_mini_qspi_defconfig       |   2 +-
>>  configs/anbernic-rgxx3-rk3566_defconfig       |   2 +-
>>  configs/ap143_defconfig                       |   2 +-
>>  configs/ap152_defconfig                       |   2 +-
>>  configs/apple_m1_defconfig                    |   2 +-
>>  configs/astro_mcf5373l_defconfig              |   2 +-
>>  configs/at91sam9rlek_dataflash_defconfig      |   2 +-
>>  configs/at91sam9rlek_mmc_defconfig            |   2 +-
>>  configs/at91sam9rlek_nandflash_defconfig      |   2 +-
>>  configs/bcm7260_defconfig                     |   2 +-
>>  configs/bcm7445_defconfig                     |   2 +-
>>  configs/bcm968380gerg_ram_defconfig           |   2 +-
>>  configs/bcmns_defconfig                       |   2 +-
>>  configs/chromebook_samus_tpl_defconfig        |   2 +-
>>  configs/cortina_presidio-asic-base_defconfig  |   2 +-
>>  configs/cortina_presidio-asic-pnand_defconfig |   2 +-
>>  configs/durian_defconfig                      |   2 +-
>>  configs/e850-96_defconfig                     |   2 +-
>>  configs/ea-lpc3250devkitv2_defconfig          |   2 +-
>>  configs/efi-x86_app32_defconfig               |   2 +-
>>  configs/efi-x86_app64_defconfig               |   2 +-
>>  configs/emsdp_defconfig                       |   2 +-
>>  configs/evb-ast2500_defconfig                 |   1 +
>>  configs/evb-ast2600_defconfig                 |   1 +
>>  configs/evb-px5_defconfig                     |   2 +-
>>  configs/generic-rk3568_defconfig              |   2 +-
>>  configs/generic-rk3588_defconfig              |   2 +-
>>  configs/hc2910_2aghd05_defconfig              |   2 +-
>>  configs/igep00x0_defconfig                    |   2 +-
>>  configs/imx6q_bosch_acc_defconfig             |   2 +-
>>  configs/imx6ulz_smm_m2_defconfig              |   2 +-
>>  configs/iot_devkit_defconfig                  |   2 +-
>>  configs/j722s_evm_r5_defconfig                |   2 +-
>>  configs/legoev3_defconfig                     |   2 +-
>>  configs/mk808_defconfig                       |   2 +-
>>  configs/mx23evk_defconfig                     |   2 +-
>>  configs/mx28evk_defconfig                     |   2 +-
>>  configs/mx6memcal_defconfig                   |   2 +-
>>  configs/mx6ulz_14x14_evk_defconfig            |   2 +-
>>  configs/mx7ulp_com_defconfig                  |   2 +-
>>  configs/mx7ulp_evk_defconfig                  |   2 +-
>>  configs/mx7ulp_evk_plugin_defconfig           |   2 +-
>>  configs/netgear_cg3100d_ram_defconfig         |   2 +-
>>  configs/nsim_700_defconfig                    |   2 +-
>>  configs/nsim_700be_defconfig                  |   2 +-
>>  configs/nsim_hs38be_defconfig                 |   2 +-
>>  configs/openpiton_riscv64_defconfig           |   2 +-
>>  configs/openpiton_riscv64_spl_defconfig       |   2 +-
>>  configs/origen_defconfig                      |   2 +-
>>  configs/pe2201_defconfig                      |   2 +-
>>  configs/pinecube_defconfig                    |   2 +-
>>  configs/pm9261_defconfig                      |   2 +-
>>  configs/qemu_arm64_lwip_defconfig             |   9 +
>>  configs/s5p4418_nanopi2_defconfig             |   2 +-
>>  configs/s5p_goni_defconfig                    |   2 +-
>>  configs/s5pc210_universal_defconfig           |   2 +-
>>  configs/sama5d27_giantboard_defconfig         |   2 +-
>>  configs/sama5d29_curiosity_mmc1_defconfig     |   2 +-
>>  configs/sama5d29_curiosity_mmc_defconfig      |   2 +-
>>  .../sama5d29_curiosity_qspiflash_defconfig    |   2 +-
>>  configs/sama7g54_curiosity_mmc_defconfig      |   2 +-
>>  .../sama7g54_curiosity_nandflash_defconfig    |   2 +-
>>  .../sama7g54_curiosity_qspiflash_defconfig    |   2 +-
>>  configs/sipeed_maix_bitm_defconfig            |   2 +-
>>  configs/sipeed_maix_smode_defconfig           |   2 +-
>>  configs/stemmy_defconfig                      |   2 +-
>>  configs/stm32f429-discovery_defconfig         |   2 +-
>>  configs/stm32f429-evaluation_defconfig        |   2 +-
>>  configs/stm32f469-discovery_defconfig         |   2 +-
>>  configs/stm32h743-disco_defconfig             |   2 +-
>>  configs/stm32h743-eval_defconfig              |   2 +-
>>  configs/stm32h750-art-pi_defconfig            |   2 +-
>>  configs/stm32mp25_defconfig                   |   2 +-
>>  configs/stmark2_defconfig                     |   2 +-
>>  configs/th1520_lpi4a_defconfig                |   2 +-
>>  configs/thunderx_88xx_defconfig               |   2 +-
>>  configs/tools-only_defconfig                  |  34 +-
>>  configs/topic_miami_defconfig                 |   2 +-
>>  configs/topic_miamilite_defconfig             |   2 +-
>>  configs/topic_miamiplus_defconfig             |   2 +-
>>  configs/total_compute_defconfig               |   2 +-
>>  configs/trats2_defconfig                      |   2 +-
>>  configs/trats_defconfig                       |   2 +-
>>  configs/xenguest_arm64_defconfig              |   2 +-
>>  configs/xenguest_arm64_virtio_defconfig       |   2 +-
>>  configs/xilinx_versal_mini_defconfig          |   2 +-
>>  configs/xilinx_versal_mini_emmc0_defconfig    |   2 +-
>>  configs/xilinx_versal_mini_emmc1_defconfig    |   2 +-
>>  configs/xilinx_versal_mini_ospi_defconfig     |   2 +-
>>  configs/xilinx_versal_mini_qspi_defconfig     |   2 +-
>>  configs/xilinx_versal_net_mini_defconfig      |   2 +-
>>  configs/xilinx_versal_net_mini_emmc_defconfig |   2 +-
>>  configs/xilinx_versal_net_mini_ospi_defconfig |   2 +-
>>  configs/xilinx_versal_net_mini_qspi_defconfig |   2 +-
>>  configs/xilinx_zynqmp_mini_defconfig          |   2 +-
>>  configs/xilinx_zynqmp_mini_emmc0_defconfig    |   2 +-
>>  configs/xilinx_zynqmp_mini_emmc1_defconfig    |   2 +-
>>  configs/xilinx_zynqmp_mini_nand_defconfig     |   2 +-
>>  .../xilinx_zynqmp_mini_nand_single_defconfig  |   2 +-
>>  configs/xilinx_zynqmp_mini_qspi_defconfig     |   2 +-
>>  configs/zynq_cse_nand_defconfig               |   2 +-
>>  configs/zynq_cse_nor_defconfig                |   2 +-
>>  configs/zynq_cse_qspi_defconfig               |   2 +-
>>  drivers/dfu/Kconfig                           |   1 +
>>  drivers/fastboot/Kconfig                      |   1 +
>>  drivers/net/Kconfig                           |  16 +-
>>  drivers/net/Makefile                          |   1 +
>>  drivers/net/eepro100.c                        |   2 +-
>>  drivers/net/phy/Kconfig                       |   2 +-
>>  drivers/net/rtl8139.c                         |   2 +-
>>  drivers/net/sandbox-lwip.c                    |  85 ++
>>  drivers/usb/gadget/Kconfig                    |   2 +-
>>  include/net-common.h                          | 509 ++++++++++
>>  include/net-legacy.h                          | 541 ++++++++++
>>  include/net-lwip.h                            |  41 +
>>  include/net.h                                 | 943 +-----------------
>>  lib/Makefile                                  |   2 +
>>  lib/binman.c                                  |   1 +
>>  lib/lwip/Makefile                             |  55 +
>>  lib/lwip/lwip/src/apps/tftp/tftp.c            | 104 +-
>>  .../lwip/src/include/lwip/apps/tftp_client.h  |   1 +
>>  lib/lwip/u-boot/arch/cc.h                     |  45 +
>>  lib/lwip/u-boot/arch/sys_arch.h               |   0
>>  lib/lwip/u-boot/limits.h                      |   0
>>  lib/lwip/u-boot/lwipopts.h                    | 157 +++
>>  lib/tiny-printf.c                             |   3 +-
>>  net/Kconfig                                   |  81 +-
>>  net/Makefile                                  |  20 +-
>>  net/eth-uclass.c                              |  38 +-
>>  net/lwip/Kconfig                              |  49 +
>>  net/lwip/Makefile                             |   8 +
>>  net/lwip/dhcp.c                               | 136 +++
>>  net/lwip/dns.c                                | 127 +++
>>  net/lwip/eth_internal.h                       |  35 +
>>  net/lwip/net-lwip.c                           | 307 ++++++
>>  net/lwip/ping.c                               | 177 ++++
>>  net/lwip/tftp.c                               | 290 ++++++
>>  net/lwip/wget.c                               | 357 +++++++
>>  net/net-common.c                              |  13 +
>>  net/net.c                                     |  12 -
>>  test/boot/bootdev.c                           |  11 +-
>>  test/boot/bootflow.c                          |   7 +-
>>  test/cmd/Makefile                             |   2 +
>>  test/dm/Makefile                              |   2 +
>>  175 files changed, 3607 insertions(+), 1346 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 drivers/net/sandbox-lwip.c
>>  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
>>  create mode 100644 net/net-common.c
>>
>> --
>> 2.40.1
>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-03 16:10   ` Jerome Forissier
@ 2024-10-03 16:11     ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-03 16:11 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov

On Thu, 3 Oct 2024 at 19:10, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
>
>
> On 10/3/24 18:00, Ilias Apalodimas wrote:
> > Hi Jerome,
> >
> > I'll have a look, but there seems to be reviewed-by and acked-by tags missing?
> > Any chance you lost those during rebasing ?
>
> I only dropped your R-b from the MAINTAINERS patch because I changed it slightly.
> Now I see you Acked it so that's good :)

Ah thanks, yea I saw that was missing and assumed more would be
dropped. Ack is more appropriate in this case, so let's preserve that

Thanks
/Ilias
>
> --
> Jerome
>
> >
> > Thanks
> > /Ilias
> > On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
> > <jerome.forissier@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. and
> >> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE
> >>
> >> Notes
> >>
> >> 1. A number of features are currently incompatible with NET_LWIP:
> >> DFU_TFTP, FASTBOOT, SPL_NET, ETH_SANDBOX, ETH_SANDBOX_RAW, DM_ETH. They
> >> 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.
> >>
> >> 2. Due to the above, and in order to provide some level of testing of the
> >> lwIP code in CI even when the legacy NET is the default, a new QEMU
> >> configuration is introduced (qemu_arm64_lwip_defconfig) which is
> >> based on qemu_arm64_defconfig with NET_LWIP and CMD_*_LWIP enabled.
> >> In addition to that, this series has some [TESTING] patches
> >> which make NET_LWIP the default.
> >>
> >> [1] https://lore.kernel.org/all/20231127125726.3735-1-maxim.uvarov@linaro.org/
> >> [2] https://www.nongnu.org/lwip/
> >> [3] https://en.wikipedia.org/wiki/LwIP
> >>
> >> Changes in v11:
> >>
> >> - Rebased onto next
> >> - "Miscellaneous fixes" removed (patches were merged in next). The
> >> series still begins with small fixes posted separately [1] [2] [3].
> >> - Add (some) support for CMD_PXE and therefore drop patch "[TESTING]
> >> configs: set CONFIG_NET=y when PXE is enabled". This is build-tested
> >> only and it is very likely that some work is needed to make it useful.
> >> For example, adding the code for DHCP option 209 to lwIP so that
> >> BOOTP_PXE_DHCP_OPTION can be supported.
> >> - SANDBOX is now supported, but with the dm eth and wget tests
> >> disabled.
> >> - Move eth_set_enable_bootdevs() declaration to net-common.h
> >> Fixes warning with snow_defconfig:
> >> test/test-main.c:310:17: warning: implicit declaration of function ‘eth_set_enable_bootdevs’ [....]
> >> - Do eth_init() and eth_init_rings() only once, and do not forget
> >> lwip_init()! Fixes TFTP stalls on TI K3 (reported by Tom R. and
> >> tested by Ilias A.)
> >> - Set MEM_ALIGNMENT to 8 in lib/lwip/u-boot/lwipopts.h. Fixes TFTP
> >> random crashes on TI K3 (Ilias A.)
> >> - net_lwip_rx(): call free_pkt() even when recv() has returned 0,
> >> as required by the driver model documentation (and imx8mp_evk). Fixes
> >> a regression introduced in v9. Goes together with patch [2].
> >> - Add "lwip: tftp: bind to TFTP port only when in server mode" to
> >> fix an issue with interrupted tftp commands (the tftp command hangs
> >> if it is interrupted with Ctrl-C and started again).
> >> - TFTP: fix uninitialized "ret" variable in do_tftpb(); print "Abort"
> >> on Ctrl-C.
> >> - MAINTAINERS: remove README and add sandbox ethernet driver to the
> >> list of maintained files.
> >> - AFAICT, CI should be all good except qemu_xtensa_dc233c which is
> >> broken when NET_LWIP=y (QEMU just hangs with no output). I could
> >> not find or build a suitable GDB binary to debug that.
> >>
> >> [1] https://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
> >> [2] https://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/
> >> [3] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
> >>
> >> Changes in v10:
> >>
> >> - Rebase onto next
> >> - URL for lwIP changed in cover letter: using GitHub now since all
> >> tags have suddenly disappeared from the repository on gnu.org.
> >> - Post fixes as a separate series [1] or individual patches [2] [3]
> >> - Add "if NET_LWIP" to net/lwip/Kconfig to fix a kconfig warning
> >>   when doing the full branch build with buildman ("[NEW]")
> >> - net/ is added to libs-y only when NET or NET_LWIP, not NO_NET
> >> - Apply review tags
> >>
> >> [1] http://patchwork.ozlabs.org/project/uboot/list/?series=422079
> >> https://lists.denx.de/pipermail/u-boot/2024-September/563904.html
> >> [2] http://patchwork.ozlabs.org/project/uboot/list/?series=421962
> >> [3] http://patchwork.ozlabs.org/project/uboot/list/?series=421959
> >>
> >> Changes in v9:
> >>
> >> - Rebased onto master, reordered commits to put some fixes that are not
> >> strictly related to lwIP first.
> >> - New commit "test/py: test_efi_loader: add missing dependency on
> >> cmd_tftpboot" (Tom R.)
> >> - test_efi_loader.py: add missing dependency on cmd_wget (Tom R.)
> >> - wget: fix divide by zero when transfer takes less than 1ms (Tom R.)
> >> - New commit "configs: use syntax CONFIG_FOO=n in tools-only_defconfig"
> >> (Tom R.)
> >> - Make TCP_WND configurable (via CONFIG_LWIP_TCP_WND) because a large
> >> value is needed for good performance especially with latency but
> >> transfers stall in QEMU (-net user) when the value is larger than a few
> >> KB (Anton A., offlist)
> >> - Added [TESTING] commits to run CI with NET_LWIP enabled by default
> >> except for SANDBOX and platforms that enable PXE, and fixed a number of
> >> issues:
> >>   * coreboot_defconfig: 'implicit declaration' warnings on
> >>     ip_checksum_ok() and compute_ip_checksum()
> >>   * Fix EFI net tests (bootefi selftest) by adding missing
> >>     push_packed() call to net_process_received_packet()
> >>   * qemu_arm64: fix test_efi_loader.py failures (skip HTTP test
> >>     by default since it needs a HTTP server; fix a bug in the dhcp
> >>     command which would not set the "serverip" variable)
> >>   * QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139:
> >>     Fixed receive errors due to calling free_pkt() with a
> >>     length of zero. r2dplus_tulip: fixed "dm_pci_phys_to_bus:
> >>     invalid physical address" caused by too late eth_init_rings().
> >> With that the CI status is all GREEN:
> >> https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9225&view=results
> >>
> >> Changes in v8:
> >>
> >> - Fix bootefi with tftp and wget. It would previously fail with an
> >> error message: "No UEFI binary known at 200000". Tested on Raspberry
> >> 3B+. Also fix the legacy wget. (Tom R.)
> >> - wget: add "Bytes transferred =" message and accept legacy syntax
> >> for better compatibility which also makes it easier to add a test to
> >> the test suite
> >> - wget: When no server name or address is supplied, use
> >> ${httpserverip} then ${serverip}.
> >> - wget: start the timer used for measuring throughput when the first
> >> data block is received. In other words: do not include DNS resolution
> >> and TCP connection time in measurement. It gives better numbers ;)
> >> but more importantly is how the legacy code works.
> >> - wget: handle non-200 result codes from the server as errors.
> >> - tftp: when no server name or ip is supplied, use ${tftpserverip}
> >> then fall back to ${serverip}.
> >> - New commit: "test/py: add HTTP (wget) test"
> >> - New commit: "net: wget: removed unused function wget_success()"
> >> - Change back all !CONFIG_IS_ENABLED(NO_NET) tests to
> >> (CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)) since the
> >> NO_NET case is wrong when CONFIG_SPL_BUILD or CONFIG_TPL_BUILD is
> >> defined (Tom R.)
> >>
> >> Changes in v7:
> >>
> >> - Rebased onto master
> >> - Updated binary size comparisons in this cover letter. Note that
> >> the increase for imx8mp_evk_defconfig  was wrong due to a configuration
> >> error.
> >>
> >> Changes in v6:
> >>
> >> - Rebased on next
> >> - "flash: prefix error codes with FL_"
> >> Update drivers/mtd/altera_qspi.c too (Tom R.)
> >> - "net: introduce alternative implementation as net-lwip/"
> >> Introduce a "Networking" top-level menu in the main Kconfig. Avoids
> >> having a lot of network-related symbols on the first screen of
> >> menuconfig. The "Networking stack" choice as well as the applicable
> >> symbols (depending on the selected choice) are now all inside this
> >> "Networking" menu. (Michal S.)
> >> For PROT_DHCP_LWIP and PROT_DNS_LWIP, use "select" PROT_UDP_LWIP
> >> rather than "depends on".
> >> Move NET_RANDOM_ETHADDR to the common ('if NET || NET_LWIP') block.
> >> Move SYS_RX_ETH_BUFFER out of 'if NET || NET_LWIP' since it is used
> >> unguarded in some code (e.g., am62x_beagleplay_r5) (Tom R.).
> >> - "net: split include/net.h into net{,-common,-legacy,-lwip}.h"
> >> Move net_random_ethaddr() to net-common.h.
> >> - "net: eth-uclass: add function eth_start_udev()"
> >> Fix typo and apply Tom R.'s R-b.
> >> - "net-lwip: add DHCP support and dhcp commmand"
> >> Convert !CONFIG_IS_ENABLED(NET) to
> >> CONFIG_IS_ENABLED(NO_NET) in board/xilinx/common/board.c
> >> to fix an issue with device having no MAC address (thanks Michal S.).
> >> Do the same at other places (icore_mx8mp.c, imx8mp_debix_model_a.c,
> >> board/ti/am335x/board.c, tiny-printf.c).
> >> Move CMD_MII and CMD_MDIO into 'if NET || NET_LWIP'.
> >> - "net-lwip: add TFTP support and tftpboot command":
> >> Fix help string.
> >> - "net: split cmd/net.c into cmd/net.c and cmd/net-common.c":
> >> Apply Ilias' R-b.
> >> - "net-lwip: add TFTP_BLOCKSIZE"
> >> Apply Ilias' R-b. I moved the TFTP_BLOCKSIZE Kconfig into this commit
> >> where it belongs (it was previously in "net" split ... net.h").
> >>
> >> Changes in v5:
> >>
> >> - Rebased on next
> >> - Refactor Kconfig options to avoid duplicates
> >> - Library functions use a more consistent naming (dhcp_loop(),
> >> ping_loop() etc.) and take a struct udevice * parameter (Heinrich S.)
> >> - Do not use net_process_receive_packet() for input anymore. Instead of
> >> calling eth_rx() which would invoke net_process_receive_packet(), we
> >> call a new net_lwip_rx(udev) function which invokes the device recv()
> >> and pushes the packets up the lwIP stack. Thus everything is tied to
> >> a udevice now. (Heinrich S.)
> >> - Add "configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y"
> >> (Tom R.)
> >> - tftp: unify display with legacy command: add throughput, 65 hashes per
> >> line, one every 10 blocks received (Tom R.)
> >> - Moved net-lwip/* to net/lwip/* (Simon G.)
> >> - Rename static function low_level_output() to linkoutput() since it is
> >> the name used in the lwIP netif struct.
> >> - Fixed off-by-one in parse_url() which could cause wget to fail when
> >> passed a URL with a host name (as opposed to a URL with an IP address).
> >> - Improved TFTP performance by adding support for the blksize option
> >> (patches "lwip: tftp: add support of blksize option to client" and
> >> "net-lwip: add TFTP_BLOCKSIZE) (Tom R.)
> >> - Add an optional port number to the tftp command for easier testing
> >> (syntax: tftp [[ip:[port:]]filename])
> >> - wget: display an "unsupported URI" error if uri is not http://
> >> (Jon H.)
> >> - Adjusted the lwIP TCP options in lib/lwip/u-boot/lwipopts.h for
> >> better performance, in particular TCP_WND.
> >> - Add "net: fec_mxc_init(): do not ignore return status of fec_open()"
> >> - Set the proper environment variables when DHCP succeeds (ipaddr%d
> >> etc.) and read the proper ones for the given device in new_netif(),
> >> allowing correct behavior when several adapters are available (tested
> >> on i.MX8M Plus).
> >> - Fix an alignment issue with outgoing packets (see the linkoutput()
> >> function). With that the i.MX8M Plus ENET1 interface works properly.
> >> (reported by Tim H.).
> >> - Add review tags
> >>
> >> 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.
> >>
> >>
> >> Jerome Forissier (28):
> >>   net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
> >>   Make AVB_VERIFY depend on FASTBOOT
> >>   linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
> >>   sandbox: add dummy driver ETH_SANDBOX_LWIP
> >>   test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
> >>   test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
> >>   net: introduce alternative implementation as net-lwip/
> >>   configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y
> >>   net: split include/net.h into net{,-common,-legacy,-lwip}.h
> >>   net: move copy_filename() to new file net/net-common.c
> >>   net: eth-uclass: add function eth_start_udev()
> >>   net-lwip: build lwIP
> >>   net-lwip: add DHCP support and dhcp commmand
> >>   lwip: tftp: bind to TFTP port only when in server mode
> >>   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
> >>   lwip: tftp: add support of blksize option to client
> >>   net-lwip: add TFTP_BLOCKSIZE
> >>   CI: add qemu_arm64_lwip to the test matrix
> >>   MAINTAINERS: net-lwip: add myself as a maintainer
> >>   configs: use syntax CONFIG_FOO=n in tools-only_defconfig
> >>   [TESTING] configs: set CONFIG_NET=y for FTGMAC100
> >>   [TESTING] Kconfig: enable NET_LWIP by default
> >>
> >> Jonathan Humphreys (1):
> >>   net-lwip: lwIP wget supports user defined port in the uri, so allow
> >>     it.
> >>
> >>  .azure-pipelines.yml                          |   7 +
> >>  Kconfig                                       |  29 +
> >>  MAINTAINERS                                   |  11 +
> >>  Makefile                                      |   6 +-
> >>  arch/Kconfig                                  |   2 +-
> >>  board/engicam/imx8mp/icore_mx8mp.c            |   2 +-
> >>  .../imx8mp_debix_model_a.c                    |   2 +-
> >>  board/ti/am335x/board.c                       |   3 +-
> >>  board/xilinx/common/board.c                   |   3 +-
> >>  boot/Kconfig                                  |   4 +-
> >>  cmd/Kconfig                                   | 140 +--
> >>  cmd/Makefile                                  |   9 +-
> >>  cmd/bdinfo.c                                  |   5 +-
> >>  cmd/elf.c                                     |   2 +-
> >>  cmd/net-common.c                              | 109 ++
> >>  cmd/net-lwip.c                                |  45 +
> >>  cmd/net.c                                     | 115 ---
> >>  common/Kconfig                                |   3 +-
> >>  common/board_r.c                              |   4 +-
> >>  common/spl/Kconfig                            |   1 +
> >>  common/usb_kbd.c                              |   2 +-
> >>  configs/LicheePi_Zero_defconfig               |   2 +-
> >>  configs/M5249EVB_defconfig                    |   2 +-
> >>  configs/am335x_pdu001_defconfig               |   2 +-
> >>  configs/am62ax_evm_r5_defconfig               |   2 +-
> >>  configs/am62px_evm_r5_defconfig               |   2 +-
> >>  configs/am62x_beagleplay_r5_defconfig         |   2 +-
> >>  configs/amcore_defconfig                      |   2 +-
> >>  configs/amd_versal2_mini_defconfig            |   2 +-
> >>  configs/amd_versal2_mini_emmc_defconfig       |   2 +-
> >>  configs/amd_versal2_mini_ospi_defconfig       |   2 +-
> >>  configs/amd_versal2_mini_qspi_defconfig       |   2 +-
> >>  configs/anbernic-rgxx3-rk3566_defconfig       |   2 +-
> >>  configs/ap143_defconfig                       |   2 +-
> >>  configs/ap152_defconfig                       |   2 +-
> >>  configs/apple_m1_defconfig                    |   2 +-
> >>  configs/astro_mcf5373l_defconfig              |   2 +-
> >>  configs/at91sam9rlek_dataflash_defconfig      |   2 +-
> >>  configs/at91sam9rlek_mmc_defconfig            |   2 +-
> >>  configs/at91sam9rlek_nandflash_defconfig      |   2 +-
> >>  configs/bcm7260_defconfig                     |   2 +-
> >>  configs/bcm7445_defconfig                     |   2 +-
> >>  configs/bcm968380gerg_ram_defconfig           |   2 +-
> >>  configs/bcmns_defconfig                       |   2 +-
> >>  configs/chromebook_samus_tpl_defconfig        |   2 +-
> >>  configs/cortina_presidio-asic-base_defconfig  |   2 +-
> >>  configs/cortina_presidio-asic-pnand_defconfig |   2 +-
> >>  configs/durian_defconfig                      |   2 +-
> >>  configs/e850-96_defconfig                     |   2 +-
> >>  configs/ea-lpc3250devkitv2_defconfig          |   2 +-
> >>  configs/efi-x86_app32_defconfig               |   2 +-
> >>  configs/efi-x86_app64_defconfig               |   2 +-
> >>  configs/emsdp_defconfig                       |   2 +-
> >>  configs/evb-ast2500_defconfig                 |   1 +
> >>  configs/evb-ast2600_defconfig                 |   1 +
> >>  configs/evb-px5_defconfig                     |   2 +-
> >>  configs/generic-rk3568_defconfig              |   2 +-
> >>  configs/generic-rk3588_defconfig              |   2 +-
> >>  configs/hc2910_2aghd05_defconfig              |   2 +-
> >>  configs/igep00x0_defconfig                    |   2 +-
> >>  configs/imx6q_bosch_acc_defconfig             |   2 +-
> >>  configs/imx6ulz_smm_m2_defconfig              |   2 +-
> >>  configs/iot_devkit_defconfig                  |   2 +-
> >>  configs/j722s_evm_r5_defconfig                |   2 +-
> >>  configs/legoev3_defconfig                     |   2 +-
> >>  configs/mk808_defconfig                       |   2 +-
> >>  configs/mx23evk_defconfig                     |   2 +-
> >>  configs/mx28evk_defconfig                     |   2 +-
> >>  configs/mx6memcal_defconfig                   |   2 +-
> >>  configs/mx6ulz_14x14_evk_defconfig            |   2 +-
> >>  configs/mx7ulp_com_defconfig                  |   2 +-
> >>  configs/mx7ulp_evk_defconfig                  |   2 +-
> >>  configs/mx7ulp_evk_plugin_defconfig           |   2 +-
> >>  configs/netgear_cg3100d_ram_defconfig         |   2 +-
> >>  configs/nsim_700_defconfig                    |   2 +-
> >>  configs/nsim_700be_defconfig                  |   2 +-
> >>  configs/nsim_hs38be_defconfig                 |   2 +-
> >>  configs/openpiton_riscv64_defconfig           |   2 +-
> >>  configs/openpiton_riscv64_spl_defconfig       |   2 +-
> >>  configs/origen_defconfig                      |   2 +-
> >>  configs/pe2201_defconfig                      |   2 +-
> >>  configs/pinecube_defconfig                    |   2 +-
> >>  configs/pm9261_defconfig                      |   2 +-
> >>  configs/qemu_arm64_lwip_defconfig             |   9 +
> >>  configs/s5p4418_nanopi2_defconfig             |   2 +-
> >>  configs/s5p_goni_defconfig                    |   2 +-
> >>  configs/s5pc210_universal_defconfig           |   2 +-
> >>  configs/sama5d27_giantboard_defconfig         |   2 +-
> >>  configs/sama5d29_curiosity_mmc1_defconfig     |   2 +-
> >>  configs/sama5d29_curiosity_mmc_defconfig      |   2 +-
> >>  .../sama5d29_curiosity_qspiflash_defconfig    |   2 +-
> >>  configs/sama7g54_curiosity_mmc_defconfig      |   2 +-
> >>  .../sama7g54_curiosity_nandflash_defconfig    |   2 +-
> >>  .../sama7g54_curiosity_qspiflash_defconfig    |   2 +-
> >>  configs/sipeed_maix_bitm_defconfig            |   2 +-
> >>  configs/sipeed_maix_smode_defconfig           |   2 +-
> >>  configs/stemmy_defconfig                      |   2 +-
> >>  configs/stm32f429-discovery_defconfig         |   2 +-
> >>  configs/stm32f429-evaluation_defconfig        |   2 +-
> >>  configs/stm32f469-discovery_defconfig         |   2 +-
> >>  configs/stm32h743-disco_defconfig             |   2 +-
> >>  configs/stm32h743-eval_defconfig              |   2 +-
> >>  configs/stm32h750-art-pi_defconfig            |   2 +-
> >>  configs/stm32mp25_defconfig                   |   2 +-
> >>  configs/stmark2_defconfig                     |   2 +-
> >>  configs/th1520_lpi4a_defconfig                |   2 +-
> >>  configs/thunderx_88xx_defconfig               |   2 +-
> >>  configs/tools-only_defconfig                  |  34 +-
> >>  configs/topic_miami_defconfig                 |   2 +-
> >>  configs/topic_miamilite_defconfig             |   2 +-
> >>  configs/topic_miamiplus_defconfig             |   2 +-
> >>  configs/total_compute_defconfig               |   2 +-
> >>  configs/trats2_defconfig                      |   2 +-
> >>  configs/trats_defconfig                       |   2 +-
> >>  configs/xenguest_arm64_defconfig              |   2 +-
> >>  configs/xenguest_arm64_virtio_defconfig       |   2 +-
> >>  configs/xilinx_versal_mini_defconfig          |   2 +-
> >>  configs/xilinx_versal_mini_emmc0_defconfig    |   2 +-
> >>  configs/xilinx_versal_mini_emmc1_defconfig    |   2 +-
> >>  configs/xilinx_versal_mini_ospi_defconfig     |   2 +-
> >>  configs/xilinx_versal_mini_qspi_defconfig     |   2 +-
> >>  configs/xilinx_versal_net_mini_defconfig      |   2 +-
> >>  configs/xilinx_versal_net_mini_emmc_defconfig |   2 +-
> >>  configs/xilinx_versal_net_mini_ospi_defconfig |   2 +-
> >>  configs/xilinx_versal_net_mini_qspi_defconfig |   2 +-
> >>  configs/xilinx_zynqmp_mini_defconfig          |   2 +-
> >>  configs/xilinx_zynqmp_mini_emmc0_defconfig    |   2 +-
> >>  configs/xilinx_zynqmp_mini_emmc1_defconfig    |   2 +-
> >>  configs/xilinx_zynqmp_mini_nand_defconfig     |   2 +-
> >>  .../xilinx_zynqmp_mini_nand_single_defconfig  |   2 +-
> >>  configs/xilinx_zynqmp_mini_qspi_defconfig     |   2 +-
> >>  configs/zynq_cse_nand_defconfig               |   2 +-
> >>  configs/zynq_cse_nor_defconfig                |   2 +-
> >>  configs/zynq_cse_qspi_defconfig               |   2 +-
> >>  drivers/dfu/Kconfig                           |   1 +
> >>  drivers/fastboot/Kconfig                      |   1 +
> >>  drivers/net/Kconfig                           |  16 +-
> >>  drivers/net/Makefile                          |   1 +
> >>  drivers/net/eepro100.c                        |   2 +-
> >>  drivers/net/phy/Kconfig                       |   2 +-
> >>  drivers/net/rtl8139.c                         |   2 +-
> >>  drivers/net/sandbox-lwip.c                    |  85 ++
> >>  drivers/usb/gadget/Kconfig                    |   2 +-
> >>  include/net-common.h                          | 509 ++++++++++
> >>  include/net-legacy.h                          | 541 ++++++++++
> >>  include/net-lwip.h                            |  41 +
> >>  include/net.h                                 | 943 +-----------------
> >>  lib/Makefile                                  |   2 +
> >>  lib/binman.c                                  |   1 +
> >>  lib/lwip/Makefile                             |  55 +
> >>  lib/lwip/lwip/src/apps/tftp/tftp.c            | 104 +-
> >>  .../lwip/src/include/lwip/apps/tftp_client.h  |   1 +
> >>  lib/lwip/u-boot/arch/cc.h                     |  45 +
> >>  lib/lwip/u-boot/arch/sys_arch.h               |   0
> >>  lib/lwip/u-boot/limits.h                      |   0
> >>  lib/lwip/u-boot/lwipopts.h                    | 157 +++
> >>  lib/tiny-printf.c                             |   3 +-
> >>  net/Kconfig                                   |  81 +-
> >>  net/Makefile                                  |  20 +-
> >>  net/eth-uclass.c                              |  38 +-
> >>  net/lwip/Kconfig                              |  49 +
> >>  net/lwip/Makefile                             |   8 +
> >>  net/lwip/dhcp.c                               | 136 +++
> >>  net/lwip/dns.c                                | 127 +++
> >>  net/lwip/eth_internal.h                       |  35 +
> >>  net/lwip/net-lwip.c                           | 307 ++++++
> >>  net/lwip/ping.c                               | 177 ++++
> >>  net/lwip/tftp.c                               | 290 ++++++
> >>  net/lwip/wget.c                               | 357 +++++++
> >>  net/net-common.c                              |  13 +
> >>  net/net.c                                     |  12 -
> >>  test/boot/bootdev.c                           |  11 +-
> >>  test/boot/bootflow.c                          |   7 +-
> >>  test/cmd/Makefile                             |   2 +
> >>  test/dm/Makefile                              |   2 +
> >>  175 files changed, 3607 insertions(+), 1346 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 drivers/net/sandbox-lwip.c
> >>  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
> >>  create mode 100644 net/net-common.c
> >>
> >> --
> >> 2.40.1
> >>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig
  2024-10-03 15:46 ` [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig Jerome Forissier
@ 2024-10-03 16:44   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-03 16:44 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Add qemu_arm64_lwip_defconfig which #include's qemu_arm64_defconfig and
> selects NET_LWIP instead of NET. This config has all the supported net
> commands enabled.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  configs/qemu_arm64_lwip_defconfig | 9 +++++++++
>  1 file changed, 9 insertions(+)
>  create mode 100644 configs/qemu_arm64_lwip_defconfig
>
> diff --git a/configs/qemu_arm64_lwip_defconfig b/configs/qemu_arm64_lwip_defconfig
> new file mode 100644
> index 00000000000..d3d8ef16e66
> --- /dev/null
> +++ b/configs/qemu_arm64_lwip_defconfig
> @@ -0,0 +1,9 @@
> +#include <configs/qemu_arm64_defconfig>
> +
> +CONFIG_ARM=y
> +CONFIG_ARCH_QEMU=y
> +
> +CONFIG_NET_LWIP=y
> +CONFIG_CMD_DNS=y
> +CONFIG_CMD_WGET=y
> +CONFIG_EFI_HTTP_BOOT=y
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h
  2024-10-03 15:22 ` [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h Jerome Forissier
@ 2024-10-04  6:00   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:00 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Simon Glass, Heinrich Schuchardt, Rasmus Villemoes, Andrew Davis,
	Sumit Garg, Bryan Brattlof, Leon M. Busch-George, Masahisa Kojima,
	Sean Anderson, Marek Vasut

On Thu, 3 Oct 2024 at 18:24, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Make net.h a wrapper which includes net-common.h and either
> net-legacy.h or net-lwip.h based on NET_LWIP.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  Makefile             |   4 +-
>  include/net-common.h | 501 +++++++++++++++++++++++
>  include/net-legacy.h | 544 +++++++++++++++++++++++++
>  include/net-lwip.h   |  14 +
>  include/net.h        | 943 +------------------------------------------
>  5 files changed, 1066 insertions(+), 940 deletions(-)
>  create mode 100644 include/net-common.h
>  create mode 100644 include/net-legacy.h
>  create mode 100644 include/net-lwip.h
>
> diff --git a/Makefile b/Makefile
> index 96211738b2f..0910d8692d7 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -836,7 +836,9 @@ UBOOTINCLUDE    := \
>                         -I$(srctree)/arch/arm/thumb1/include)) \
>         -I$(srctree)/arch/$(ARCH)/include \
>         -include $(srctree)/include/linux/kconfig.h \
> -       -I$(srctree)/dts/upstream/include
> +       -I$(srctree)/dts/upstream/include \
> +       $(if $(CONFIG_NET_LWIP), -I$(srctree)/lib/lwip/lwip/src/include \
> +               -I$(srctree)/lib/lwip/u-boot)
>
>  NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
>
> diff --git a/include/net-common.h b/include/net-common.h
> new file mode 100644
> index 00000000000..543f528a4a4
> --- /dev/null
> +++ b/include/net-common.h
> @@ -0,0 +1,501 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef __NET_COMMON_H__
> +#define __NET_COMMON_H__
> +
> +#include <asm/cache.h>
> +#include <command.h>
> +#include <env.h>
> +#include <hexdump.h>
> +#include <linux/if_ether.h>
> +#include <linux/types.h>
> +#include <rand.h>
> +#include <time.h>
> +
> +#define DEBUG_NET_PKT_TRACE 0  /* Trace all packet data */
> +
> +/*
> + *     The number of receive packet buffers, and the required packet buffer
> + *     alignment in memory.
> + *
> + */
> +#define PKTBUFSRX      CONFIG_SYS_RX_ETH_BUFFER
> +#define PKTALIGN       ARCH_DMA_MINALIGN
> +
> +/* IPv4 addresses are always 32 bits in size */
> +struct in_addr {
> +       __be32 s_addr;
> +};
> +
> +#define PROT_IP                0x0800          /* IP protocol                  */
> +#define PROT_ARP       0x0806          /* IP ARP protocol              */
> +#define PROT_WOL       0x0842          /* ether-wake WoL protocol      */
> +#define PROT_RARP      0x8035          /* IP ARP protocol              */
> +#define PROT_VLAN      0x8100          /* IEEE 802.1q protocol         */
> +#define PROT_IPV6      0x86dd          /* IPv6 over bluebook           */
> +#define PROT_PPP_SES   0x8864          /* PPPoE session messages       */
> +#define PROT_NCSI      0x88f8          /* NC-SI control packets        */
> +
> +#define IPPROTO_ICMP    1      /* Internet Control Message Protocol    */
> +#define IPPROTO_TCP    6       /* Transmission Control Protocol        */
> +#define IPPROTO_UDP    17      /* User Datagram Protocol               */
> +
> +#define IP_OFFS                0x1fff /* ip offset *= 8 */
> +#define IP_FLAGS       0xe000 /* first 3 bits */
> +#define IP_FLAGS_RES   0x8000 /* reserved */
> +#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */
> +#define IP_FLAGS_MFRAG 0x2000 /* more fragments */
> +
> +#define IP_HDR_SIZE            (sizeof(struct ip_hdr))
> +
> +#define IP_MIN_FRAG_DATAGRAM_SIZE      (IP_HDR_SIZE + 8)
> +
> +/*
> + *     Internet Protocol (IP) + UDP header.
> + */
> +struct ip_udp_hdr {
> +       u8              ip_hl_v;        /* header length and version    */
> +       u8              ip_tos;         /* type of service              */
> +       u16             ip_len;         /* total length                 */
> +       u16             ip_id;          /* identification               */
> +       u16             ip_off;         /* fragment offset field        */
> +       u8              ip_ttl;         /* time to live                 */
> +       u8              ip_p;           /* protocol                     */
> +       u16             ip_sum;         /* checksum                     */
> +       struct in_addr  ip_src;         /* Source IP address            */
> +       struct in_addr  ip_dst;         /* Destination IP address       */
> +       u16             udp_src;        /* UDP source port              */
> +       u16             udp_dst;        /* UDP destination port         */
> +       u16             udp_len;        /* Length of UDP packet         */
> +       u16             udp_xsum;       /* Checksum                     */
> +} __attribute__((packed));
> +
> +#define IP_UDP_HDR_SIZE                (sizeof(struct ip_udp_hdr))
> +#define UDP_HDR_SIZE           (IP_UDP_HDR_SIZE - IP_HDR_SIZE)
> +
> +/* Number of packets processed together */
> +#define ETH_PACKETS_BATCH_RECV 32
> +
> +/* ARP hardware address length */
> +#define ARP_HLEN 6
> +/*
> + * The size of a MAC address in string form, each digit requires two chars
> + * and five separator characters to form '00:00:00:00:00:00'.
> + */
> +#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
> +
> +#define ARP_HDR_SIZE   (8+20)          /* Size assuming ethernet       */
> +
> +#   define ARP_ETHER       1           /* Ethernet  hardware address   */
> +
> +/*
> + * Maximum packet size; used to allocate packet storage. Use
> + * the maxium Ethernet frame size as specified by the Ethernet
> + * standard including the 802.1Q tag (VLAN tagging).
> + * maximum packet size =  1522
> + * maximum packet size and multiple of 32 bytes =  1536
> + */
> +#define PKTSIZE                        1522
> +#ifndef CONFIG_DM_DSA
> +#define PKTSIZE_ALIGN          1536
> +#else
> +/* Maximum DSA tagging overhead (headroom and/or tailroom) */
> +#define DSA_MAX_OVR            256
> +#define PKTSIZE_ALIGN          (1536 + DSA_MAX_OVR)
> +#endif
> +
> +/*
> + * Maximum receive ring size; that is, the number of packets
> + * we can buffer before overflow happens. Basically, this just
> + * needs to be enough to prevent a packet being discarded while
> + * we are processing the previous one.
> + * Used only in drivers/net/mvgbe.c.
> + */
> +#define RINGSZ         4
> +#define RINGSZ_LOG2    2
> +
> +extern int             net_restart_wrap;       /* Tried all network devices */
> +extern uchar               *net_rx_packets[PKTBUFSRX]; /* Receive packets */
> +extern const u8                net_bcast_ethaddr[ARP_HLEN];    /* Ethernet broadcast address */
> +extern char    net_boot_file_name[1024];/* Boot File name */
> +
> +/**
> + * compute_ip_checksum() - Compute IP checksum
> + *
> + * @addr:      Address to check (must be 16-bit aligned)
> + * @nbytes:    Number of bytes to check (normally a multiple of 2)
> + * Return: 16-bit IP checksum
> + */
> +unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
> +
> +/**
> + * ip_checksum_ok() - check if a checksum is correct
> + *
> + * This works by making sure the checksum sums to 0
> + *
> + * @addr:      Address to check (must be 16-bit aligned)
> + * @nbytes:    Number of bytes to check (normally a multiple of 2)
> + * Return: true if the checksum matches, false if not
> + */
> +int ip_checksum_ok(const void *addr, unsigned nbytes);
> +
> +/**
> + * add_ip_checksums() - add two IP checksums
> + *
> + * @offset:    Offset of first sum (if odd we do a byte-swap)
> + * @sum:       First checksum
> + * @new_sum:   New checksum to add
> + * Return: updated 16-bit IP checksum
> + */
> +unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
> +
> +/*
> + * The devname can be either an exact name given by the driver or device tree
> + * or it can be an alias of the form "eth%d"
> + */
> +struct udevice *eth_get_dev_by_name(const char *devname);
> +int eth_is_active(struct udevice *dev); /* Test device for active state */
> +
> +/*
> + * Get the hardware address for an ethernet interface .
> + * Args:
> + *     base_name - base name for device (normally "eth")
> + *     index - device index number (0 for first)
> + *     enetaddr - returns 6 byte hardware address
> + * Returns:
> + *     Return true if the address is valid.
> + */
> +int eth_env_get_enetaddr_by_index(const char *base_name, int index,
> +                                uchar *enetaddr);
> +
> +/**
> + * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
> + *
> + * This sets up an environment variable with the given MAC address (@enetaddr).
> + * The environment variable to be set is defined by <@base_name><@index>addr.
> + * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
> + * eth1addr, etc.
> + *
> + * @base_name:  Base name for variable, typically "eth"
> + * @index:      Index of interface being updated (>=0)
> + * @enetaddr:   Pointer to MAC address to put into the variable
> + * Return: 0 if OK, other value on error
> + */
> +int eth_env_set_enetaddr_by_index(const char *base_name, int index,
> +                                uchar *enetaddr);
> +
> +/*
> + * Initialize USB ethernet device with CONFIG_DM_ETH
> + * Returns:
> + *     0 is success, non-zero is error status.
> + */
> +int usb_ether_init(void);
> +
> +int eth_init(void);                    /* Initialize the device */
> +int eth_send(void *packet, int length);           /* Send a packet */
> +#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
> +int eth_receive(void *packet, int length); /* Receive a packet*/
> +extern void (*push_packet)(void *packet, int length);
> +#endif
> +int eth_rx(void);                      /* Check for received packets */
> +
> +/**
> + * reset_phy() - Reset the Ethernet PHY
> + *
> + * This should be implemented by boards if CONFIG_RESET_PHY_R is enabled
> + */
> +void reset_phy(void);
> +
> +#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
> +/**
> + * eth_set_enable_bootdevs() - Enable or disable binding of Ethernet bootdevs
> + *
> + * These get in the way of bootstd testing, so are normally disabled by tests.
> + * This provide control of this setting. It only affects binding of Ethernet
> + * devices, so if that has already happened, this flag does nothing.
> + *
> + * @enable: true to enable binding of bootdevs when binding new Ethernet
> + * devices, false to disable it
> + */
> +void eth_set_enable_bootdevs(bool enable);
> +#else
> +static inline void eth_set_enable_bootdevs(bool enable) {}
> +#endif
> +
> +static inline void net_send_packet(uchar *pkt, int len)
> +{
> +       if (DEBUG_NET_PKT_TRACE)
> +               print_hex_dump_bytes("tx: ", DUMP_PREFIX_OFFSET, pkt, len);
> +       /* Currently no way to return errors from eth_send() */
> +       (void) eth_send(pkt, len);
> +}
> +
> +enum eth_recv_flags {
> +       /*
> +        * Check hardware device for new packets (otherwise only return those
> +        * which are already in the memory buffer ready to process)
> +        */
> +       ETH_RECV_CHECK_DEVICE           = 1 << 0,
> +};
> +
> +/**
> + * struct eth_ops - functions of Ethernet MAC controllers
> + *
> + * start: Prepare the hardware to send and receive packets
> + * send: Send the bytes passed in "packet" as a packet on the wire
> + * recv: Check if the hardware received a packet. If so, set the pointer to the
> + *      packet buffer in the packetp parameter. If not, return an error or 0 to
> + *      indicate that the hardware receive FIFO is empty. If 0 is returned, the
> + *      network stack will not process the empty packet, but free_pkt() will be
> + *      called if supplied
> + * free_pkt: Give the driver an opportunity to manage its packet buffer memory
> + *          when the network stack is finished processing it. This will only be
> + *          called when no error was returned from recv - optional
> + * stop: Stop the hardware from looking for packets - may be called even if
> + *      state == PASSIVE
> + * mcast: Join or leave a multicast group (for TFTP) - optional
> + * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
> + *              on some platforms like ARM). This function expects the
> + *              eth_pdata::enetaddr field to be populated. The method can
> + *              return -ENOSYS to indicate that this is not implemented for
> +                this hardware - optional.
> + * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
> + *                 ROM on the board. This is how the driver should expose it
> + *                 to the network stack. This function should fill in the
> + *                 eth_pdata::enetaddr field - optional
> + * set_promisc: Enable or Disable promiscuous mode
> + * get_sset_count: Number of statistics counters
> + * get_string: Names of the statistic counters
> + * get_stats: The values of the statistic counters
> + */
> +struct eth_ops {
> +       int (*start)(struct udevice *dev);
> +       int (*send)(struct udevice *dev, void *packet, int length);
> +       int (*recv)(struct udevice *dev, int flags, uchar **packetp);
> +       int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
> +       void (*stop)(struct udevice *dev);
> +       int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
> +       int (*write_hwaddr)(struct udevice *dev);
> +       int (*read_rom_hwaddr)(struct udevice *dev);
> +       int (*set_promisc)(struct udevice *dev, bool enable);
> +       int (*get_sset_count)(struct udevice *dev);
> +       void (*get_strings)(struct udevice *dev, u8 *data);
> +       void (*get_stats)(struct udevice *dev, u64 *data);
> +};
> +
> +#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
> +
> +struct udevice *eth_get_dev(void); /* get the current device */
> +unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
> +int eth_rx(void);                      /* Check for received packets */
> +void eth_halt(void);                   /* stop SCC */
> +const char *eth_get_name(void);                /* get name of current device */
> +int eth_get_dev_index(void);
> +
> +int eth_initialize(void);              /* Initialize network subsystem */
> +void eth_try_another(int first_restart);       /* Change the device */
> +void eth_set_current(void);            /* set nterface to ethcur var */
> +
> +enum eth_state_t {
> +       ETH_STATE_INIT,
> +       ETH_STATE_PASSIVE,
> +       ETH_STATE_ACTIVE
> +};
> +
> +/**
> + * struct eth_pdata - Platform data for Ethernet MAC controllers
> + *
> + * @iobase: The base address of the hardware registers
> + * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
> + * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
> + * @max_speed: Maximum speed of Ethernet connection supported by MAC
> + * @priv_pdata: device specific plat
> + */
> +struct eth_pdata {
> +       phys_addr_t iobase;
> +       unsigned char enetaddr[ARP_HLEN];
> +       int phy_interface;
> +       int max_speed;
> +       void *priv_pdata;
> +};
> +
> +struct ethernet_hdr {
> +       u8              et_dest[ARP_HLEN];      /* Destination node     */
> +       u8              et_src[ARP_HLEN];       /* Source node          */
> +       u16             et_protlen;             /* Protocol or length   */
> +} __attribute__((packed));
> +
> +/* Ethernet header size */
> +#define ETHER_HDR_SIZE (sizeof(struct ethernet_hdr))
> +
> +/**
> + * net_random_ethaddr - Generate software assigned random Ethernet address
> + * @addr: Pointer to a six-byte array containing the Ethernet address
> + *
> + * Generate a random Ethernet address (MAC) that is not multicast
> + * and has the local assigned bit set.
> + */
> +static inline void net_random_ethaddr(uchar *addr)
> +{
> +       int i;
> +       unsigned int seed = get_ticks();
> +
> +       for (i = 0; i < 6; i++)
> +               addr[i] = rand_r(&seed);
> +
> +       addr[0] &= 0xfe;        /* clear multicast bit */
> +       addr[0] |= 0x02;        /* set local assignment bit (IEEE802) */
> +}
> +
> +/**
> + * is_zero_ethaddr - Determine if give Ethernet address is all zeros.
> + * @addr: Pointer to a six-byte array containing the Ethernet address
> + *
> + * Return true if the address is all zeroes.
> + */
> +static inline int is_zero_ethaddr(const u8 *addr)
> +{
> +       return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
> +}
> +
> +/**
> + * is_multicast_ethaddr - Determine if the Ethernet address is a multicast.
> + * @addr: Pointer to a six-byte array containing the Ethernet address
> + *
> + * Return true if the address is a multicast address.
> + * By definition the broadcast address is also a multicast address.
> + */
> +static inline int is_multicast_ethaddr(const u8 *addr)
> +{
> +       return 0x01 & addr[0];
> +}
> +
> +/*
> + * is_broadcast_ethaddr - Determine if the Ethernet address is broadcast
> + * @addr: Pointer to a six-byte array containing the Ethernet address
> + *
> + * Return true if the address is the broadcast address.
> + */
> +static inline int is_broadcast_ethaddr(const u8 *addr)
> +{
> +       return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
> +               0xff;
> +}
> +
> +/*
> + * is_valid_ethaddr - Determine if the given Ethernet address is valid
> + * @addr: Pointer to a six-byte array containing the Ethernet address
> + *
> + * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
> + * a multicast address, and is not FF:FF:FF:FF:FF:FF.
> + *
> + * Return true if the address is valid.
> + */
> +static inline int is_valid_ethaddr(const u8 *addr)
> +{
> +       /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
> +        * explicitly check for it here. */
> +       return !is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr);
> +}
> +
> +/**
> + * string_to_enetaddr() - Parse a MAC address
> + *
> + * Convert a string MAC address
> + *
> + * Implemented in lib/net_utils.c (built unconditionally)
> + *
> + * @addr: MAC address in aa:bb:cc:dd:ee:ff format, where each part is a 2-digit
> + *     hex value
> + * @enetaddr: Place to put MAC address (6 bytes)
> + */
> +void string_to_enetaddr(const char *addr, uint8_t *enetaddr);
> +
> +/**
> + * string_to_ip() - Convert a string to ip address
> + *
> + * Implemented in lib/net_utils.c (built unconditionally)
> + *
> + * @s: Input string to parse
> + * @return: in_addr struct containing the parsed IP address
> + */
> +struct in_addr string_to_ip(const char *s);
> +
> +/* copy a filename (allow for "..." notation, limit length) */
> +void copy_filename(char *dst, const char *src, int size);
> +
> +/* Processes a received packet */
> +void net_process_received_packet(uchar *in_packet, int len);
> +
> +/**
> + * update_tftp - Update firmware over TFTP (via DFU)
> + *
> + * This function updates board's firmware via TFTP
> + *
> + * @param addr - memory address where data is stored
> + * @param interface - the DFU medium name - e.g. "mmc"
> + * @param devstring - the DFU medium number - e.g. "1"
> + *
> + * Return: - 0 on success, other value on failure
> + */
> +int update_tftp(ulong addr, char *interface, char *devstring);
> +
> +/**
> + * env_get_ip() - Convert an environment value to to an ip address
> + *
> + * @var: Environment variable to convert. The value of this variable must be
> + *     in the format format a.b.c.d, where each value is a decimal number from
> + *     0 to 255
> + * Return: IP address, or 0 if invalid
> + */
> +static inline struct in_addr env_get_ip(char *var)
> +{
> +       return string_to_ip(env_get(var));
> +}
> +
> +int net_init(void);
> +
> +/**
> + * dhcp_run() - Run DHCP on the current ethernet device
> + *
> + * This sets the autoload variable, then puts it back to similar to its original
> + * state (y, n or unset).
> + *
> + * @addr: Address to load the file into (0 if @autoload is false)
> + * @fname: Filename of file to load (NULL if @autoload is false or to use the
> + * default filename)
> + * @autoload: true to load the file, false to just get the network IP
> + * @return 0 if OK, -EINVAL if the environment failed, -ENOENT if ant file was
> + * not found
> + */
> +int dhcp_run(ulong addr, const char *fname, bool autoload);
> +
> +/**
> + * do_tftpb - Run the tftpboot command
> + *
> + * @cmdtp: Command information for tftpboot
> + * @flag: Command flags (CMD_FLAG_...)
> + * @argc: Number of arguments
> + * @argv: List of arguments
> + * Return: result (see enum command_ret_t)
> + */
> +int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
> +
> +/**
> + * wget_with_dns() - runs dns host IP address resulution before wget
> + *
> + * @dst_addr:  destination address to download the file
> + * @uri:       uri string of target file of wget
> + * Return:     downloaded file size, negative if failed
> + */
> +int wget_with_dns(ulong dst_addr, char *uri);
> +/**
> + * wget_validate_uri() - varidate the uri
> + *
> + * @uri:       uri string of target file of wget
> + * Return:     true if uri is valid, false if uri is invalid
> + */
> +bool wget_validate_uri(char *uri);
> +//int do_wget(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[]);
> +
> +#endif /* __NET_COMMON_H__ */
> diff --git a/include/net-legacy.h b/include/net-legacy.h
> new file mode 100644
> index 00000000000..19c991e12f6
> --- /dev/null
> +++ b/include/net-legacy.h
> @@ -0,0 +1,544 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + *     LiMon Monitor (LiMon) - Network.
> + *
> + *     Copyright 1994 - 2000 Neil Russell.
> + *     (See License)
> + *
> + * History
> + *     9/16/00   bor  adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
> + */
> +
> +#ifndef __NET_LEGACY_H__
> +#define __NET_LEGACY_H__
> +
> +#include <linux/types.h>
> +#include <asm/byteorder.h>     /* for nton* / ntoh* stuff */
> +#include <log.h>
> +#include <time.h>
> +#include <linux/if_ether.h>
> +
> +struct bd_info;
> +struct cmd_tbl;
> +struct udevice;
> +
> +#define DEBUG_LL_STATE 0       /* Link local state machine changes */
> +#define DEBUG_DEV_PKT 0                /* Packets or info directed to the device */
> +#define DEBUG_NET_PKT 0                /* Packets on info on the network at large */
> +#define DEBUG_INT_STATE 0      /* Internal network state changes */
> +
> +/* ARP hardware address length */
> +#define ARP_HLEN 6
> +/*
> + * The size of a MAC address in string form, each digit requires two chars
> + * and five separator characters to form '00:00:00:00:00:00'.
> + */
> +#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
> +
> +/**
> + * An incoming packet handler.
> + * @param pkt    pointer to the application packet
> + * @param dport  destination UDP port
> + * @param sip    source IP address
> + * @param sport  source UDP port
> + * @param len    packet length
> + */
> +typedef void rxhand_f(uchar *pkt, unsigned dport,
> +                     struct in_addr sip, unsigned sport,
> +                     unsigned len);
> +
> +/**
> + * An incoming ICMP packet handler.
> + * @param type ICMP type
> + * @param code ICMP code
> + * @param dport        destination UDP port
> + * @param sip  source IP address
> + * @param sport        source UDP port
> + * @param pkt  pointer to the ICMP packet data
> + * @param len  packet length
> + */
> +typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport,
> +               struct in_addr sip, unsigned sport, uchar *pkt, unsigned len);
> +
> +/*
> + *     A timeout handler.  Called after time interval has expired.
> + */
> +typedef void   thand_f(void);
> +
> +/*
> + * The devname can be either an exact name given by the driver or device tree
> + * or it can be an alias of the form "eth%d"
> + */
> +struct udevice *eth_get_dev_by_name(const char *devname);
> +int eth_init_state_only(void); /* Set active state */
> +void eth_halt_state_only(void); /* Set passive state */
> +
> +/**
> + * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
> + *
> + * This sets up an environment variable with the given MAC address (@enetaddr).
> + * The environment variable to be set is defined by <@base_name><@index>addr.
> + * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
> + * eth1addr, etc.
> + *
> + * @base_name:  Base name for variable, typically "eth"
> + * @index:      Index of interface being updated (>=0)
> + * @enetaddr:   Pointer to MAC address to put into the variable
> + * Return: 0 if OK, other value on error
> + */
> +int eth_env_set_enetaddr_by_index(const char *base_name, int index,
> +                                uchar *enetaddr);
> +
> +/*
> + * Get the hardware address for an ethernet interface .
> + * Args:
> + *     base_name - base name for device (normally "eth")
> + *     index - device index number (0 for first)
> + *     enetaddr - returns 6 byte hardware address
> + * Returns:
> + *     Return true if the address is valid.
> + */
> +int eth_env_get_enetaddr_by_index(const char *base_name, int index,
> +                                uchar *enetaddr);
> +
> +int eth_send(void *packet, int length);           /* Send a packet */
> +
> +#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
> +int eth_receive(void *packet, int length); /* Receive a packet*/
> +extern void (*push_packet)(void *packet, int length);
> +#endif
> +int eth_mcast_join(struct in_addr mcast_addr, int join);
> +
> +/**********************************************************************/
> +/*
> + *     Protocol headers.
> + */
> +
> +#define ETH_FCS_LEN    4               /* Octets in the FCS            */
> +
> +struct e802_hdr {
> +       u8              et_dest[ARP_HLEN];      /* Destination node     */
> +       u8              et_src[ARP_HLEN];       /* Source node          */
> +       u16             et_protlen;             /* Protocol or length   */
> +       u8              et_dsap;                /* 802 DSAP             */
> +       u8              et_ssap;                /* 802 SSAP             */
> +       u8              et_ctl;                 /* 802 control          */
> +       u8              et_snap1;               /* SNAP                 */
> +       u8              et_snap2;
> +       u8              et_snap3;
> +       u16             et_prot;                /* 802 protocol         */
> +} __attribute__((packed));
> +
> +/* 802 + SNAP + ethernet header size */
> +#define E802_HDR_SIZE  (sizeof(struct e802_hdr))
> +
> +/*
> + *     Virtual LAN Ethernet header
> + */
> +struct vlan_ethernet_hdr {
> +       u8              vet_dest[ARP_HLEN];     /* Destination node     */
> +       u8              vet_src[ARP_HLEN];      /* Source node          */
> +       u16             vet_vlan_type;          /* PROT_VLAN            */
> +       u16             vet_tag;                /* TAG of VLAN          */
> +       u16             vet_type;               /* protocol type        */
> +} __attribute__((packed));
> +
> +/* VLAN Ethernet header size */
> +#define VLAN_ETHER_HDR_SIZE    (sizeof(struct vlan_ethernet_hdr))
> +
> +/*
> + *     Internet Protocol (IP) header.
> + */
> +struct ip_hdr {
> +       u8              ip_hl_v;        /* header length and version    */
> +       u8              ip_tos;         /* type of service              */
> +       u16             ip_len;         /* total length                 */
> +       u16             ip_id;          /* identification               */
> +       u16             ip_off;         /* fragment offset field        */
> +       u8              ip_ttl;         /* time to live                 */
> +       u8              ip_p;           /* protocol                     */
> +       u16             ip_sum;         /* checksum                     */
> +       struct in_addr  ip_src;         /* Source IP address            */
> +       struct in_addr  ip_dst;         /* Destination IP address       */
> +} __attribute__((packed));
> +
> +#define IP_OFFS                0x1fff /* ip offset *= 8 */
> +#define IP_FLAGS       0xe000 /* first 3 bits */
> +#define IP_FLAGS_RES   0x8000 /* reserved */
> +#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */
> +#define IP_FLAGS_MFRAG 0x2000 /* more fragments */
> +
> +#define IP_HDR_SIZE            (sizeof(struct ip_hdr))
> +
> +#define IP_MIN_FRAG_DATAGRAM_SIZE      (IP_HDR_SIZE + 8)
> +
> +/*
> + *     Address Resolution Protocol (ARP) header.
> + */
> +struct arp_hdr {
> +       u16             ar_hrd;         /* Format of hardware address   */
> +#   define ARP_ETHER       1           /* Ethernet  hardware address   */
> +       u16             ar_pro;         /* Format of protocol address   */
> +       u8              ar_hln;         /* Length of hardware address   */
> +       u8              ar_pln;         /* Length of protocol address   */
> +#   define ARP_PLEN    4
> +       u16             ar_op;          /* Operation                    */
> +#   define ARPOP_REQUEST    1          /* Request  to resolve  address */
> +#   define ARPOP_REPLY     2           /* Response to previous request */
> +
> +#   define RARPOP_REQUEST   3          /* Request  to resolve  address */
> +#   define RARPOP_REPLY            4           /* Response to previous request */
> +
> +       /*
> +        * The remaining fields are variable in size, according to
> +        * the sizes above, and are defined as appropriate for
> +        * specific hardware/protocol combinations.
> +        */
> +       u8              ar_data[0];
> +#define ar_sha         ar_data[0]
> +#define ar_spa         ar_data[ARP_HLEN]
> +#define ar_tha         ar_data[ARP_HLEN + ARP_PLEN]
> +#define ar_tpa         ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN]
> +#if 0
> +       u8              ar_sha[];       /* Sender hardware address      */
> +       u8              ar_spa[];       /* Sender protocol address      */
> +       u8              ar_tha[];       /* Target hardware address      */
> +       u8              ar_tpa[];       /* Target protocol address      */
> +#endif /* 0 */
> +} __attribute__((packed));
> +
> +
> +/*
> + * ICMP stuff (just enough to handle (host) redirect messages)
> + */
> +#define ICMP_ECHO_REPLY                0       /* Echo reply                   */
> +#define ICMP_NOT_REACH         3       /* Detination unreachable       */
> +#define ICMP_REDIRECT          5       /* Redirect (change route)      */
> +#define ICMP_ECHO_REQUEST      8       /* Echo request                 */
> +
> +/* Codes for REDIRECT. */
> +#define ICMP_REDIR_NET         0       /* Redirect Net                 */
> +#define ICMP_REDIR_HOST                1       /* Redirect Host                */
> +
> +/* Codes for NOT_REACH */
> +#define ICMP_NOT_REACH_PORT    3       /* Port unreachable             */
> +
> +struct icmp_hdr {
> +       u8              type;
> +       u8              code;
> +       u16             checksum;
> +       union {
> +               struct {
> +                       u16     id;
> +                       u16     sequence;
> +               } echo;
> +               u32     gateway;
> +               struct {
> +                       u16     unused;
> +                       u16     mtu;
> +               } frag;
> +               u8 data[0];
> +       } un;
> +} __attribute__((packed));
> +
> +#define ICMP_HDR_SIZE          (sizeof(struct icmp_hdr))
> +#define IP_ICMP_HDR_SIZE       (IP_HDR_SIZE + ICMP_HDR_SIZE)
> +
> +/*
> + * Maximum packet size; used to allocate packet storage. Use
> + * the maxium Ethernet frame size as specified by the Ethernet
> + * standard including the 802.1Q tag (VLAN tagging).
> + * maximum packet size =  1522
> + * maximum packet size and multiple of 32 bytes =  1536
> + */
> +#define PKTSIZE                        1522
> +#ifndef CONFIG_DM_DSA
> +#define PKTSIZE_ALIGN          1536
> +#else
> +/* Maximum DSA tagging overhead (headroom and/or tailroom) */
> +#define DSA_MAX_OVR            256
> +#define PKTSIZE_ALIGN          (1536 + DSA_MAX_OVR)
> +#endif
> +
> +/**********************************************************************/
> +/*
> + *     Globals.
> + *
> + * Note:
> + *
> + * All variables of type struct in_addr are stored in NETWORK byte order
> + * (big endian).
> + */
> +
> +/* net.c */
> +/** BOOTP EXTENTIONS **/
> +extern struct in_addr net_gateway;     /* Our gateway IP address */
> +extern struct in_addr net_netmask;     /* Our subnet mask (0 = unknown) */
> +/* Our Domain Name Server (0 = unknown) */
> +extern struct in_addr net_dns_server;
> +#if defined(CONFIG_BOOTP_DNS2)
> +/* Our 2nd Domain Name Server (0 = unknown) */
> +extern struct in_addr net_dns_server2;
> +#endif
> +extern char    net_nis_domain[32];     /* Our IS domain */
> +extern char    net_hostname[32];       /* Our hostname */
> +#ifdef CONFIG_NET
> +extern char    net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN];  /* Our root path */
> +#endif
> +/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
> +extern char *pxelinux_configfile;
> +/** END OF BOOTP EXTENTIONS **/
> +extern u8              net_ethaddr[ARP_HLEN];          /* Our ethernet address */
> +extern u8              net_server_ethaddr[ARP_HLEN];   /* Boot server enet address */
> +extern struct in_addr  net_ip;         /* Our    IP addr (0 = unknown) */
> +extern struct in_addr  net_server_ip;  /* Server IP addr (0 = unknown) */
> +extern uchar           *net_tx_packet;         /* THE transmit packet */
> +extern uchar           *net_rx_packets[PKTBUFSRX]; /* Receive packets */
> +extern uchar           *net_rx_packet;         /* Current receive packet */
> +extern int             net_rx_packet_len;      /* Current rx packet length */
> +extern const u8                net_null_ethaddr[ARP_HLEN];
> +
> +#define VLAN_NONE      4095                    /* untagged */
> +#define VLAN_IDMASK    0x0fff                  /* mask of valid vlan id */
> +extern ushort          net_our_vlan;           /* Our VLAN */
> +extern ushort          net_native_vlan;        /* Our Native VLAN */
> +
> +extern int             net_restart_wrap;       /* Tried all network devices */
> +
> +enum proto_t {
> +       BOOTP, RARP, ARP, TFTPGET, DHCP, DHCP6, PING, PING6, DNS, NFS, CDP,
> +       NETCONS, SNTP, TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT_UDP, FASTBOOT_TCP,
> +       WOL, UDP, NCSI, WGET, RS
> +};
> +/* Indicates whether the file name was specified on the command line */
> +extern bool    net_boot_file_name_explicit;
> +/* The actual transferred size of the bootfile (in bytes) */
> +extern u32     net_boot_file_size;
> +/* Boot file size in blocks as reported by the DHCP server */
> +extern u32     net_boot_file_expected_size_in_blocks;
> +
> +#if defined(CONFIG_CMD_DNS)
> +extern char *net_dns_resolve;          /* The host to resolve  */
> +extern char *net_dns_env_var;          /* the env var to put the ip into */
> +#endif
> +
> +#if defined(CONFIG_CMD_PING)
> +extern struct in_addr net_ping_ip;     /* the ip address to ping */
> +#endif
> +
> +#if defined(CONFIG_CMD_CDP)
> +/* when CDP completes these hold the return values */
> +extern ushort cdp_native_vlan;         /* CDP returned native VLAN */
> +extern ushort cdp_appliance_vlan;      /* CDP returned appliance VLAN */
> +
> +/*
> + * Check for a CDP packet by examining the received MAC address field
> + */
> +static inline int is_cdp_packet(const uchar *ethaddr)
> +{
> +       extern const u8 net_cdp_ethaddr[ARP_HLEN];
> +
> +       return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
> +}
> +#endif
> +
> +#if defined(CONFIG_CMD_SNTP)
> +extern struct in_addr  net_ntp_server;         /* the ip address to NTP */
> +extern int net_ntp_time_offset;                        /* offset time from UTC */
> +#endif
> +
> +int net_loop(enum proto_t);
> +
> +/* Load failed.         Start again. */
> +int net_start_again(void);
> +
> +/* Get size of the ethernet header when we send */
> +int net_eth_hdr_size(void);
> +
> +/* Set ethernet header; returns the size of the header */
> +int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
> +int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
> +
> +/* Set IP header */
> +void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
> +                      u16 pkt_len, u8 proto);
> +void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
> +                               int sport, int len);
> +
> +/* Callbacks */
> +rxhand_f *net_get_udp_handler(void);   /* Get UDP RX packet handler */
> +void net_set_udp_handler(rxhand_f *);  /* Set UDP RX packet handler */
> +rxhand_f *net_get_arp_handler(void);   /* Get ARP RX packet handler */
> +void net_set_arp_handler(rxhand_f *);  /* Set ARP RX packet handler */
> +bool arp_is_waiting(void);             /* Waiting for ARP reply? */
> +void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
> +void net_set_timeout_handler(ulong, thand_f *);/* Set timeout handler */
> +
> +/* Network loop state */
> +enum net_loop_state {
> +       NETLOOP_CONTINUE,
> +       NETLOOP_RESTART,
> +       NETLOOP_SUCCESS,
> +       NETLOOP_FAIL
> +};
> +extern enum net_loop_state net_state;
> +
> +static inline void net_set_state(enum net_loop_state state)
> +{
> +       debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state);
> +       net_state = state;
> +}
> +
> +/*
> + * net_get_async_tx_pkt_buf - Get a packet buffer that is not in use for
> + *                           sending an asynchronous reply
> + *
> + * returns - ptr to packet buffer
> + */
> +uchar * net_get_async_tx_pkt_buf(void);
> +
> +/**
> + * net_send_ip_packet() - Transmit "net_tx_packet" as UDP or TCP packet,
> + *                        send ARP request if needed (ether will be populated)
> + * @ether: Raw packet buffer
> + * @dest: IP address to send the datagram to
> + * @dport: Destination UDP port
> + * @sport: Source UDP port
> + * @payload_len: Length of data after the UDP header
> + * @action: TCP action to be performed
> + * @tcp_seq_num: TCP sequence number of this transmission
> + * @tcp_ack_num: TCP stream acknolegement number
> + *
> + * Return: 0 on success, other value on failure
> + */
> +int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> +                      int payload_len, int proto, u8 action, u32 tcp_seq_num,
> +                      u32 tcp_ack_num);
> +/**
> + * net_send_tcp_packet() - Transmit TCP packet.
> + * @payload_len: length of payload
> + * @dport: Destination TCP port
> + * @sport: Source TCP port
> + * @action: TCP action to be performed
> + * @tcp_seq_num: TCP sequence number of this transmission
> + * @tcp_ack_num: TCP stream acknolegement number
> + *
> + * Return: 0 on success, other value on failure
> + */
> +int net_send_tcp_packet(int payload_len, int dport, int sport, u8 action,
> +                       u32 tcp_seq_num, u32 tcp_ack_num);
> +int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
> +                       int sport, int payload_len);
> +
> +#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> +void nc_start(void);
> +int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
> +       unsigned src_port, unsigned len);
> +#endif
> +
> +static __always_inline int eth_is_on_demand_init(void)
> +{
> +#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> +       extern enum proto_t net_loop_last_protocol;
> +
> +       return net_loop_last_protocol != NETCONS;
> +#else
> +       return 1;
> +#endif
> +}
> +
> +static inline void eth_set_last_protocol(int protocol)
> +{
> +#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> +       extern enum proto_t net_loop_last_protocol;
> +
> +       net_loop_last_protocol = protocol;
> +#endif
> +}
> +
> +/*
> + * Check if autoload is enabled. If so, use either NFS or TFTP to download
> + * the boot file.
> + */
> +void net_auto_load(void);
> +
> +/*
> + * The following functions are a bit ugly, but necessary to deal with
> + * alignment restrictions on ARM.
> + *
> + * We're using inline functions, which had the smallest memory
> + * footprint in our tests.
> + */
> +/* return IP *in network byteorder* */
> +static inline struct in_addr net_read_ip(void *from)
> +{
> +       struct in_addr ip;
> +
> +       memcpy((void *)&ip, (void *)from, sizeof(ip));
> +       return ip;
> +}
> +
> +/* return ulong *in network byteorder* */
> +static inline u32 net_read_u32(void *from)
> +{
> +       u32 l;
> +
> +       memcpy((void *)&l, (void *)from, sizeof(l));
> +       return l;
> +}
> +
> +/* write IP *in network byteorder* */
> +static inline void net_write_ip(void *to, struct in_addr ip)
> +{
> +       memcpy(to, (void *)&ip, sizeof(ip));
> +}
> +
> +/* copy IP */
> +static inline void net_copy_ip(void *to, void *from)
> +{
> +       memcpy((void *)to, from, sizeof(struct in_addr));
> +}
> +
> +/* copy ulong */
> +static inline void net_copy_u32(void *to, void *from)
> +{
> +       memcpy((void *)to, (void *)from, sizeof(u32));
> +}
> +
> +/* Convert an IP address to a string */
> +void ip_to_string(struct in_addr x, char *s);
> +
> +/**
> + * string_to_ip() - Convert a string to ip address
> + *
> + * Implemented in lib/net_utils.c (built unconditionally)
> + *
> + * @s: Input string to parse
> + * @return: in_addr struct containing the parsed IP address
> + */
> +struct in_addr string_to_ip(const char *s);
> +
> +/* Convert a VLAN id to a string */
> +void vlan_to_string(ushort x, char *s);
> +
> +/* Convert a string to a vlan id */
> +ushort string_to_vlan(const char *s);
> +
> +/* read a VLAN id from an environment variable */
> +ushort env_get_vlan(char *);
> +
> +/* check if serverip is specified in filename from the command line */
> +int is_serverip_in_cmd(void);
> +
> +/**
> + * net_parse_bootfile - Parse the bootfile env var / cmd line param
> + *
> + * @param ipaddr - a pointer to the ipaddr to populate if included in bootfile
> + * @param filename - a pointer to the string to save the filename part
> + * @param max_len - The longest - 1 that the filename part can be
> + *
> + * return 1 if parsed, 0 if bootfile is empty
> + */
> +int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
> +
> +#endif /* __NET_LEGACY_H__ */
> diff --git a/include/net-lwip.h b/include/net-lwip.h
> new file mode 100644
> index 00000000000..5c3f9e7e86c
> --- /dev/null
> +++ b/include/net-lwip.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef __NET_LWIP_H__
> +#define __NET_LWIP_H__
> +
> +#include <lwip/ip4.h>
> +#include <lwip/netif.h>
> +
> +struct netif *net_lwip_new_netif(struct udevice *udev);
> +struct netif *net_lwip_new_netif_noip(struct udevice *udev);
> +void net_lwip_remove_netif(struct netif *netif);
> +struct netif *net_lwip_get_netif(void);
> +
> +#endif /* __NET_LWIP_H__ */
> diff --git a/include/net.h b/include/net.h
> index bb2ae20f52a..afa46f239ee 100644
> --- a/include/net.h
> +++ b/include/net.h
> @@ -1,949 +1,14 @@
>  /* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - *     LiMon Monitor (LiMon) - Network.
> - *
> - *     Copyright 1994 - 2000 Neil Russell.
> - *     (See License)
> - *
> - * History
> - *     9/16/00   bor  adapted to TQM823L/STK8xxL board, RARP/TFTP boot added
> - */
>
>  #ifndef __NET_H__
>  #define __NET_H__
>
> -#include <linux/types.h>
> -#include <asm/cache.h>
> -#include <asm/byteorder.h>     /* for nton* / ntoh* stuff */
> -#include <env.h>
> -#include <hexdump.h>
> -#include <log.h>
> -#include <time.h>
> -#include <linux/if_ether.h>
> -#include <rand.h>
> +#include <net-common.h>
>
> -struct bd_info;
> -struct cmd_tbl;
> -struct udevice;
> -
> -#define DEBUG_LL_STATE 0       /* Link local state machine changes */
> -#define DEBUG_DEV_PKT 0                /* Packets or info directed to the device */
> -#define DEBUG_NET_PKT 0                /* Packets on info on the network at large */
> -#define DEBUG_INT_STATE 0      /* Internal network state changes */
> -#define DEBUG_NET_PKT_TRACE 0  /* Trace all packet data */
> -
> -/*
> - *     The number of receive packet buffers, and the required packet buffer
> - *     alignment in memory.
> - *
> - */
> -#define PKTBUFSRX      CONFIG_SYS_RX_ETH_BUFFER
> -#define PKTALIGN       ARCH_DMA_MINALIGN
> -
> -/* Number of packets processed together */
> -#define ETH_PACKETS_BATCH_RECV 32
> -
> -/* ARP hardware address length */
> -#define ARP_HLEN 6
> -/*
> - * The size of a MAC address in string form, each digit requires two chars
> - * and five separator characters to form '00:00:00:00:00:00'.
> - */
> -#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1)
> -
> -/* IPv4 addresses are always 32 bits in size */
> -struct in_addr {
> -       __be32 s_addr;
> -};
> -
> -/**
> - * do_tftpb - Run the tftpboot command
> - *
> - * @cmdtp: Command information for tftpboot
> - * @flag: Command flags (CMD_FLAG_...)
> - * @argc: Number of arguments
> - * @argv: List of arguments
> - * Return: result (see enum command_ret_t)
> - */
> -int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
> -
> -/**
> - * dhcp_run() - Run DHCP on the current ethernet device
> - *
> - * This sets the autoload variable, then puts it back to similar to its original
> - * state (y, n or unset).
> - *
> - * @addr: Address to load the file into (0 if @autoload is false)
> - * @fname: Filename of file to load (NULL if @autoload is false or to use the
> - * default filename)
> - * @autoload: true to load the file, false to just get the network IP
> - * @return 0 if OK, -EINVAL if the environment failed, -ENOENT if ant file was
> - * not found
> - */
> -int dhcp_run(ulong addr, const char *fname, bool autoload);
> -
> -/**
> - * An incoming packet handler.
> - * @param pkt    pointer to the application packet
> - * @param dport  destination UDP port
> - * @param sip    source IP address
> - * @param sport  source UDP port
> - * @param len    packet length
> - */
> -typedef void rxhand_f(uchar *pkt, unsigned dport,
> -                     struct in_addr sip, unsigned sport,
> -                     unsigned len);
> -
> -/**
> - * An incoming ICMP packet handler.
> - * @param type ICMP type
> - * @param code ICMP code
> - * @param dport        destination UDP port
> - * @param sip  source IP address
> - * @param sport        source UDP port
> - * @param pkt  pointer to the ICMP packet data
> - * @param len  packet length
> - */
> -typedef void rxhand_icmp_f(unsigned type, unsigned code, unsigned dport,
> -               struct in_addr sip, unsigned sport, uchar *pkt, unsigned len);
> -
> -/*
> - *     A timeout handler.  Called after time interval has expired.
> - */
> -typedef void   thand_f(void);
> -
> -enum eth_state_t {
> -       ETH_STATE_INIT,
> -       ETH_STATE_PASSIVE,
> -       ETH_STATE_ACTIVE
> -};
> -
> -/**
> - * struct eth_pdata - Platform data for Ethernet MAC controllers
> - *
> - * @iobase: The base address of the hardware registers
> - * @enetaddr: The Ethernet MAC address that is loaded from EEPROM or env
> - * @phy_interface: PHY interface to use - see PHY_INTERFACE_MODE_...
> - * @max_speed: Maximum speed of Ethernet connection supported by MAC
> - * @priv_pdata: device specific plat
> - */
> -struct eth_pdata {
> -       phys_addr_t iobase;
> -       unsigned char enetaddr[ARP_HLEN];
> -       int phy_interface;
> -       int max_speed;
> -       void *priv_pdata;
> -};
> -
> -enum eth_recv_flags {
> -       /*
> -        * Check hardware device for new packets (otherwise only return those
> -        * which are already in the memory buffer ready to process)
> -        */
> -       ETH_RECV_CHECK_DEVICE           = 1 << 0,
> -};
> -
> -/**
> - * struct eth_ops - functions of Ethernet MAC controllers
> - *
> - * start: Prepare the hardware to send and receive packets
> - * send: Send the bytes passed in "packet" as a packet on the wire
> - * recv: Check if the hardware received a packet. If so, set the pointer to the
> - *      packet buffer in the packetp parameter. If not, return an error or 0 to
> - *      indicate that the hardware receive FIFO is empty. If 0 is returned, the
> - *      network stack will not process the empty packet, but free_pkt() will be
> - *      called if supplied
> - * free_pkt: Give the driver an opportunity to manage its packet buffer memory
> - *          when the network stack is finished processing it. This will only be
> - *          called when no error was returned from recv - optional
> - * stop: Stop the hardware from looking for packets - may be called even if
> - *      state == PASSIVE
> - * mcast: Join or leave a multicast group (for TFTP) - optional
> - * write_hwaddr: Write a MAC address to the hardware (used to pass it to Linux
> - *              on some platforms like ARM). This function expects the
> - *              eth_pdata::enetaddr field to be populated. The method can
> - *              return -ENOSYS to indicate that this is not implemented for
> -                this hardware - optional.
> - * read_rom_hwaddr: Some devices have a backup of the MAC address stored in a
> - *                 ROM on the board. This is how the driver should expose it
> - *                 to the network stack. This function should fill in the
> - *                 eth_pdata::enetaddr field - optional
> - * set_promisc: Enable or Disable promiscuous mode
> - * get_sset_count: Number of statistics counters
> - * get_string: Names of the statistic counters
> - * get_stats: The values of the statistic counters
> - */
> -struct eth_ops {
> -       int (*start)(struct udevice *dev);
> -       int (*send)(struct udevice *dev, void *packet, int length);
> -       int (*recv)(struct udevice *dev, int flags, uchar **packetp);
> -       int (*free_pkt)(struct udevice *dev, uchar *packet, int length);
> -       void (*stop)(struct udevice *dev);
> -       int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
> -       int (*write_hwaddr)(struct udevice *dev);
> -       int (*read_rom_hwaddr)(struct udevice *dev);
> -       int (*set_promisc)(struct udevice *dev, bool enable);
> -       int (*get_sset_count)(struct udevice *dev);
> -       void (*get_strings)(struct udevice *dev, u8 *data);
> -       void (*get_stats)(struct udevice *dev, u64 *data);
> -};
> -
> -#define eth_get_ops(dev) ((struct eth_ops *)(dev)->driver->ops)
> -
> -struct udevice *eth_get_dev(void); /* get the current device */
> -/*
> - * The devname can be either an exact name given by the driver or device tree
> - * or it can be an alias of the form "eth%d"
> - */
> -struct udevice *eth_get_dev_by_name(const char *devname);
> -unsigned char *eth_get_ethaddr(void); /* get the current device MAC */
> -
> -/* Used only when NetConsole is enabled */
> -int eth_is_active(struct udevice *dev); /* Test device for active state */
> -int eth_init_state_only(void); /* Set active state */
> -void eth_halt_state_only(void); /* Set passive state */
> -
> -int eth_initialize(void);              /* Initialize network subsystem */
> -void eth_try_another(int first_restart);       /* Change the device */
> -void eth_set_current(void);            /* set nterface to ethcur var */
> -
> -int eth_get_dev_index(void);           /* get the device index */
> -
> -/**
> - * eth_env_set_enetaddr_by_index() - set the MAC address environment variable
> - *
> - * This sets up an environment variable with the given MAC address (@enetaddr).
> - * The environment variable to be set is defined by <@base_name><@index>addr.
> - * If @index is 0 it is omitted. For common Ethernet this means ethaddr,
> - * eth1addr, etc.
> - *
> - * @base_name:  Base name for variable, typically "eth"
> - * @index:      Index of interface being updated (>=0)
> - * @enetaddr:   Pointer to MAC address to put into the variable
> - * Return: 0 if OK, other value on error
> - */
> -int eth_env_set_enetaddr_by_index(const char *base_name, int index,
> -                                uchar *enetaddr);
> -
> -/*
> - * Initialize USB ethernet device with CONFIG_DM_ETH
> - * Returns:
> - *     0 is success, non-zero is error status.
> - */
> -int usb_ether_init(void);
> -
> -/*
> - * Get the hardware address for an ethernet interface .
> - * Args:
> - *     base_name - base name for device (normally "eth")
> - *     index - device index number (0 for first)
> - *     enetaddr - returns 6 byte hardware address
> - * Returns:
> - *     Return true if the address is valid.
> - */
> -int eth_env_get_enetaddr_by_index(const char *base_name, int index,
> -                                uchar *enetaddr);
> -
> -int eth_init(void);                    /* Initialize the device */
> -int eth_send(void *packet, int length);           /* Send a packet */
> -
> -#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
> -int eth_receive(void *packet, int length); /* Receive a packet*/
> -extern void (*push_packet)(void *packet, int length);
> -#endif
> -int eth_rx(void);                      /* Check for received packets */
> -void eth_halt(void);                   /* stop SCC */
> -const char *eth_get_name(void);                /* get name of current device */
> -int eth_mcast_join(struct in_addr mcast_addr, int join);
> -
> -/**********************************************************************/
> -/*
> - *     Protocol headers.
> - */
> -
> -/*
> - *     Ethernet header
> - */
> -
> -struct ethernet_hdr {
> -       u8              et_dest[ARP_HLEN];      /* Destination node     */
> -       u8              et_src[ARP_HLEN];       /* Source node          */
> -       u16             et_protlen;             /* Protocol or length   */
> -} __attribute__((packed));
> -
> -/* Ethernet header size */
> -#define ETHER_HDR_SIZE (sizeof(struct ethernet_hdr))
> -
> -#define ETH_FCS_LEN    4               /* Octets in the FCS            */
> -
> -struct e802_hdr {
> -       u8              et_dest[ARP_HLEN];      /* Destination node     */
> -       u8              et_src[ARP_HLEN];       /* Source node          */
> -       u16             et_protlen;             /* Protocol or length   */
> -       u8              et_dsap;                /* 802 DSAP             */
> -       u8              et_ssap;                /* 802 SSAP             */
> -       u8              et_ctl;                 /* 802 control          */
> -       u8              et_snap1;               /* SNAP                 */
> -       u8              et_snap2;
> -       u8              et_snap3;
> -       u16             et_prot;                /* 802 protocol         */
> -} __attribute__((packed));
> -
> -/* 802 + SNAP + ethernet header size */
> -#define E802_HDR_SIZE  (sizeof(struct e802_hdr))
> -
> -/*
> - *     Virtual LAN Ethernet header
> - */
> -struct vlan_ethernet_hdr {
> -       u8              vet_dest[ARP_HLEN];     /* Destination node     */
> -       u8              vet_src[ARP_HLEN];      /* Source node          */
> -       u16             vet_vlan_type;          /* PROT_VLAN            */
> -       u16             vet_tag;                /* TAG of VLAN          */
> -       u16             vet_type;               /* protocol type        */
> -} __attribute__((packed));
> -
> -/* VLAN Ethernet header size */
> -#define VLAN_ETHER_HDR_SIZE    (sizeof(struct vlan_ethernet_hdr))
> -
> -#define PROT_IP                0x0800          /* IP protocol                  */
> -#define PROT_ARP       0x0806          /* IP ARP protocol              */
> -#define PROT_WOL       0x0842          /* ether-wake WoL protocol      */
> -#define PROT_RARP      0x8035          /* IP ARP protocol              */
> -#define PROT_VLAN      0x8100          /* IEEE 802.1q protocol         */
> -#define PROT_IPV6      0x86dd          /* IPv6 over bluebook           */
> -#define PROT_PPP_SES   0x8864          /* PPPoE session messages       */
> -#define PROT_NCSI      0x88f8          /* NC-SI control packets        */
> -
> -#define IPPROTO_ICMP    1      /* Internet Control Message Protocol    */
> -#define IPPROTO_TCP    6       /* Transmission Control Protocol        */
> -#define IPPROTO_UDP    17      /* User Datagram Protocol               */
> -
> -/*
> - *     Internet Protocol (IP) header.
> - */
> -struct ip_hdr {
> -       u8              ip_hl_v;        /* header length and version    */
> -       u8              ip_tos;         /* type of service              */
> -       u16             ip_len;         /* total length                 */
> -       u16             ip_id;          /* identification               */
> -       u16             ip_off;         /* fragment offset field        */
> -       u8              ip_ttl;         /* time to live                 */
> -       u8              ip_p;           /* protocol                     */
> -       u16             ip_sum;         /* checksum                     */
> -       struct in_addr  ip_src;         /* Source IP address            */
> -       struct in_addr  ip_dst;         /* Destination IP address       */
> -} __attribute__((packed));
> -
> -#define IP_OFFS                0x1fff /* ip offset *= 8 */
> -#define IP_FLAGS       0xe000 /* first 3 bits */
> -#define IP_FLAGS_RES   0x8000 /* reserved */
> -#define IP_FLAGS_DFRAG 0x4000 /* don't fragments */
> -#define IP_FLAGS_MFRAG 0x2000 /* more fragments */
> -
> -#define IP_HDR_SIZE            (sizeof(struct ip_hdr))
> -
> -#define IP_MIN_FRAG_DATAGRAM_SIZE      (IP_HDR_SIZE + 8)
> -
> -/*
> - *     Internet Protocol (IP) + UDP header.
> - */
> -struct ip_udp_hdr {
> -       u8              ip_hl_v;        /* header length and version    */
> -       u8              ip_tos;         /* type of service              */
> -       u16             ip_len;         /* total length                 */
> -       u16             ip_id;          /* identification               */
> -       u16             ip_off;         /* fragment offset field        */
> -       u8              ip_ttl;         /* time to live                 */
> -       u8              ip_p;           /* protocol                     */
> -       u16             ip_sum;         /* checksum                     */
> -       struct in_addr  ip_src;         /* Source IP address            */
> -       struct in_addr  ip_dst;         /* Destination IP address       */
> -       u16             udp_src;        /* UDP source port              */
> -       u16             udp_dst;        /* UDP destination port         */
> -       u16             udp_len;        /* Length of UDP packet         */
> -       u16             udp_xsum;       /* Checksum                     */
> -} __attribute__((packed));
> -
> -#define IP_UDP_HDR_SIZE                (sizeof(struct ip_udp_hdr))
> -#define UDP_HDR_SIZE           (IP_UDP_HDR_SIZE - IP_HDR_SIZE)
> -
> -/*
> - *     Address Resolution Protocol (ARP) header.
> - */
> -struct arp_hdr {
> -       u16             ar_hrd;         /* Format of hardware address   */
> -#   define ARP_ETHER       1           /* Ethernet  hardware address   */
> -       u16             ar_pro;         /* Format of protocol address   */
> -       u8              ar_hln;         /* Length of hardware address   */
> -       u8              ar_pln;         /* Length of protocol address   */
> -#   define ARP_PLEN    4
> -       u16             ar_op;          /* Operation                    */
> -#   define ARPOP_REQUEST    1          /* Request  to resolve  address */
> -#   define ARPOP_REPLY     2           /* Response to previous request */
> -
> -#   define RARPOP_REQUEST   3          /* Request  to resolve  address */
> -#   define RARPOP_REPLY            4           /* Response to previous request */
> -
> -       /*
> -        * The remaining fields are variable in size, according to
> -        * the sizes above, and are defined as appropriate for
> -        * specific hardware/protocol combinations.
> -        */
> -       u8              ar_data[0];
> -#define ar_sha         ar_data[0]
> -#define ar_spa         ar_data[ARP_HLEN]
> -#define ar_tha         ar_data[ARP_HLEN + ARP_PLEN]
> -#define ar_tpa         ar_data[ARP_HLEN + ARP_PLEN + ARP_HLEN]
> -#if 0
> -       u8              ar_sha[];       /* Sender hardware address      */
> -       u8              ar_spa[];       /* Sender protocol address      */
> -       u8              ar_tha[];       /* Target hardware address      */
> -       u8              ar_tpa[];       /* Target protocol address      */
> -#endif /* 0 */
> -} __attribute__((packed));
> -
> -#define ARP_HDR_SIZE   (8+20)          /* Size assuming ethernet       */
> -
> -/*
> - * ICMP stuff (just enough to handle (host) redirect messages)
> - */
> -#define ICMP_ECHO_REPLY                0       /* Echo reply                   */
> -#define ICMP_NOT_REACH         3       /* Detination unreachable       */
> -#define ICMP_REDIRECT          5       /* Redirect (change route)      */
> -#define ICMP_ECHO_REQUEST      8       /* Echo request                 */
> -
> -/* Codes for REDIRECT. */
> -#define ICMP_REDIR_NET         0       /* Redirect Net                 */
> -#define ICMP_REDIR_HOST                1       /* Redirect Host                */
> -
> -/* Codes for NOT_REACH */
> -#define ICMP_NOT_REACH_PORT    3       /* Port unreachable             */
> -
> -struct icmp_hdr {
> -       u8              type;
> -       u8              code;
> -       u16             checksum;
> -       union {
> -               struct {
> -                       u16     id;
> -                       u16     sequence;
> -               } echo;
> -               u32     gateway;
> -               struct {
> -                       u16     unused;
> -                       u16     mtu;
> -               } frag;
> -               u8 data[0];
> -       } un;
> -} __attribute__((packed));
> -
> -#define ICMP_HDR_SIZE          (sizeof(struct icmp_hdr))
> -#define IP_ICMP_HDR_SIZE       (IP_HDR_SIZE + ICMP_HDR_SIZE)
> -
> -/*
> - * Maximum packet size; used to allocate packet storage. Use
> - * the maxium Ethernet frame size as specified by the Ethernet
> - * standard including the 802.1Q tag (VLAN tagging).
> - * maximum packet size =  1522
> - * maximum packet size and multiple of 32 bytes =  1536
> - */
> -#define PKTSIZE                        1522
> -#ifndef CONFIG_DM_DSA
> -#define PKTSIZE_ALIGN          1536
> +#if defined(CONFIG_NET_LWIP)
> +#include <net-lwip.h>
>  #else
> -/* Maximum DSA tagging overhead (headroom and/or tailroom) */
> -#define DSA_MAX_OVR            256
> -#define PKTSIZE_ALIGN          (1536 + DSA_MAX_OVR)
> -#endif
> -
> -/*
> - * Maximum receive ring size; that is, the number of packets
> - * we can buffer before overflow happens. Basically, this just
> - * needs to be enough to prevent a packet being discarded while
> - * we are processing the previous one.
> - */
> -#define RINGSZ         4
> -#define RINGSZ_LOG2    2
> -
> -/**********************************************************************/
> -/*
> - *     Globals.
> - *
> - * Note:
> - *
> - * All variables of type struct in_addr are stored in NETWORK byte order
> - * (big endian).
> - */
> -
> -/* net.c */
> -/** BOOTP EXTENTIONS **/
> -extern struct in_addr net_gateway;     /* Our gateway IP address */
> -extern struct in_addr net_netmask;     /* Our subnet mask (0 = unknown) */
> -/* Our Domain Name Server (0 = unknown) */
> -extern struct in_addr net_dns_server;
> -#if defined(CONFIG_BOOTP_DNS2)
> -/* Our 2nd Domain Name Server (0 = unknown) */
> -extern struct in_addr net_dns_server2;
> +#include <net-legacy.h>
>  #endif
> -extern char    net_nis_domain[32];     /* Our IS domain */
> -extern char    net_hostname[32];       /* Our hostname */
> -#ifdef CONFIG_NET
> -extern char    net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN];  /* Our root path */
> -#endif
> -/* Indicates whether the pxe path prefix / config file was specified in dhcp option */
> -extern char *pxelinux_configfile;
> -/** END OF BOOTP EXTENTIONS **/
> -extern u8              net_ethaddr[ARP_HLEN];          /* Our ethernet address */
> -extern u8              net_server_ethaddr[ARP_HLEN];   /* Boot server enet address */
> -extern struct in_addr  net_ip;         /* Our    IP addr (0 = unknown) */
> -extern struct in_addr  net_server_ip;  /* Server IP addr (0 = unknown) */
> -extern uchar           *net_tx_packet;         /* THE transmit packet */
> -extern uchar           *net_rx_packets[PKTBUFSRX]; /* Receive packets */
> -extern uchar           *net_rx_packet;         /* Current receive packet */
> -extern int             net_rx_packet_len;      /* Current rx packet length */
> -extern const u8                net_bcast_ethaddr[ARP_HLEN];    /* Ethernet broadcast address */
> -extern const u8                net_null_ethaddr[ARP_HLEN];
> -
> -#define VLAN_NONE      4095                    /* untagged */
> -#define VLAN_IDMASK    0x0fff                  /* mask of valid vlan id */
> -extern ushort          net_our_vlan;           /* Our VLAN */
> -extern ushort          net_native_vlan;        /* Our Native VLAN */
> -
> -extern int             net_restart_wrap;       /* Tried all network devices */
> -
> -enum proto_t {
> -       BOOTP, RARP, ARP, TFTPGET, DHCP, DHCP6, PING, PING6, DNS, NFS, CDP,
> -       NETCONS, SNTP, TFTPSRV, TFTPPUT, LINKLOCAL, FASTBOOT_UDP, FASTBOOT_TCP,
> -       WOL, UDP, NCSI, WGET, RS
> -};
> -
> -extern char    net_boot_file_name[1024];/* Boot File name */
> -/* Indicates whether the file name was specified on the command line */
> -extern bool    net_boot_file_name_explicit;
> -/* The actual transferred size of the bootfile (in bytes) */
> -extern u32     net_boot_file_size;
> -/* Boot file size in blocks as reported by the DHCP server */
> -extern u32     net_boot_file_expected_size_in_blocks;
> -
> -#if defined(CONFIG_CMD_DNS)
> -extern char *net_dns_resolve;          /* The host to resolve  */
> -extern char *net_dns_env_var;          /* the env var to put the ip into */
> -#endif
> -
> -#if defined(CONFIG_CMD_PING)
> -extern struct in_addr net_ping_ip;     /* the ip address to ping */
> -#endif
> -
> -#if defined(CONFIG_CMD_CDP)
> -/* when CDP completes these hold the return values */
> -extern ushort cdp_native_vlan;         /* CDP returned native VLAN */
> -extern ushort cdp_appliance_vlan;      /* CDP returned appliance VLAN */
> -
> -/*
> - * Check for a CDP packet by examining the received MAC address field
> - */
> -static inline int is_cdp_packet(const uchar *ethaddr)
> -{
> -       extern const u8 net_cdp_ethaddr[ARP_HLEN];
> -
> -       return memcmp(ethaddr, net_cdp_ethaddr, ARP_HLEN) == 0;
> -}
> -#endif
> -
> -#if defined(CONFIG_CMD_SNTP)
> -extern struct in_addr  net_ntp_server;         /* the ip address to NTP */
> -extern int net_ntp_time_offset;                        /* offset time from UTC */
> -#endif
> -
> -/* Initialize the network adapter */
> -int net_init(void);
> -int net_loop(enum proto_t);
> -
> -/* Load failed.         Start again. */
> -int net_start_again(void);
> -
> -/* Get size of the ethernet header when we send */
> -int net_eth_hdr_size(void);
> -
> -/* Set ethernet header; returns the size of the header */
> -int net_set_ether(uchar *xet, const uchar *dest_ethaddr, uint prot);
> -int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
> -
> -/* Set IP header */
> -void net_set_ip_header(uchar *pkt, struct in_addr dest, struct in_addr source,
> -                      u16 pkt_len, u8 proto);
> -void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport,
> -                               int sport, int len);
> -
> -/**
> - * compute_ip_checksum() - Compute IP checksum
> - *
> - * @addr:      Address to check (must be 16-bit aligned)
> - * @nbytes:    Number of bytes to check (normally a multiple of 2)
> - * Return: 16-bit IP checksum
> - */
> -unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
> -
> -/**
> - * add_ip_checksums() - add two IP checksums
> - *
> - * @offset:    Offset of first sum (if odd we do a byte-swap)
> - * @sum:       First checksum
> - * @new_sum:   New checksum to add
> - * Return: updated 16-bit IP checksum
> - */
> -unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
> -
> -/**
> - * ip_checksum_ok() - check if a checksum is correct
> - *
> - * This works by making sure the checksum sums to 0
> - *
> - * @addr:      Address to check (must be 16-bit aligned)
> - * @nbytes:    Number of bytes to check (normally a multiple of 2)
> - * Return: true if the checksum matches, false if not
> - */
> -int ip_checksum_ok(const void *addr, unsigned nbytes);
> -
> -/* Callbacks */
> -rxhand_f *net_get_udp_handler(void);   /* Get UDP RX packet handler */
> -void net_set_udp_handler(rxhand_f *);  /* Set UDP RX packet handler */
> -rxhand_f *net_get_arp_handler(void);   /* Get ARP RX packet handler */
> -void net_set_arp_handler(rxhand_f *);  /* Set ARP RX packet handler */
> -bool arp_is_waiting(void);             /* Waiting for ARP reply? */
> -void net_set_icmp_handler(rxhand_icmp_f *f); /* Set ICMP RX handler */
> -void net_set_timeout_handler(ulong, thand_f *);/* Set timeout handler */
> -
> -/* Network loop state */
> -enum net_loop_state {
> -       NETLOOP_CONTINUE,
> -       NETLOOP_RESTART,
> -       NETLOOP_SUCCESS,
> -       NETLOOP_FAIL
> -};
> -extern enum net_loop_state net_state;
> -
> -static inline void net_set_state(enum net_loop_state state)
> -{
> -       debug_cond(DEBUG_INT_STATE, "--- NetState set to %d\n", state);
> -       net_state = state;
> -}
> -
> -/*
> - * net_get_async_tx_pkt_buf - Get a packet buffer that is not in use for
> - *                           sending an asynchronous reply
> - *
> - * returns - ptr to packet buffer
> - */
> -uchar * net_get_async_tx_pkt_buf(void);
> -
> -/* Transmit a packet */
> -static inline void net_send_packet(uchar *pkt, int len)
> -{
> -       if (DEBUG_NET_PKT_TRACE)
> -               print_hex_dump_bytes("tx: ", DUMP_PREFIX_OFFSET, pkt, len);
> -       /* Currently no way to return errors from eth_send() */
> -       (void) eth_send(pkt, len);
> -}
> -
> -/**
> - * net_send_ip_packet() - Transmit "net_tx_packet" as UDP or TCP packet,
> - *                        send ARP request if needed (ether will be populated)
> - * @ether: Raw packet buffer
> - * @dest: IP address to send the datagram to
> - * @dport: Destination UDP port
> - * @sport: Source UDP port
> - * @payload_len: Length of data after the UDP header
> - * @action: TCP action to be performed
> - * @tcp_seq_num: TCP sequence number of this transmission
> - * @tcp_ack_num: TCP stream acknolegement number
> - *
> - * Return: 0 on success, other value on failure
> - */
> -int net_send_ip_packet(uchar *ether, struct in_addr dest, int dport, int sport,
> -                      int payload_len, int proto, u8 action, u32 tcp_seq_num,
> -                      u32 tcp_ack_num);
> -/**
> - * net_send_tcp_packet() - Transmit TCP packet.
> - * @payload_len: length of payload
> - * @dport: Destination TCP port
> - * @sport: Source TCP port
> - * @action: TCP action to be performed
> - * @tcp_seq_num: TCP sequence number of this transmission
> - * @tcp_ack_num: TCP stream acknolegement number
> - *
> - * Return: 0 on success, other value on failure
> - */
> -int net_send_tcp_packet(int payload_len, int dport, int sport, u8 action,
> -                       u32 tcp_seq_num, u32 tcp_ack_num);
> -int net_send_udp_packet(uchar *ether, struct in_addr dest, int dport,
> -                       int sport, int payload_len);
> -
> -/* Processes a received packet */
> -void net_process_received_packet(uchar *in_packet, int len);
> -
> -#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> -void nc_start(void);
> -int nc_input_packet(uchar *pkt, struct in_addr src_ip, unsigned dest_port,
> -       unsigned src_port, unsigned len);
> -#endif
> -
> -static __always_inline int eth_is_on_demand_init(void)
> -{
> -#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> -       extern enum proto_t net_loop_last_protocol;
> -
> -       return net_loop_last_protocol != NETCONS;
> -#else
> -       return 1;
> -#endif
> -}
> -
> -static inline void eth_set_last_protocol(int protocol)
> -{
> -#if defined(CONFIG_NETCONSOLE) && !defined(CONFIG_SPL_BUILD)
> -       extern enum proto_t net_loop_last_protocol;
> -
> -       net_loop_last_protocol = protocol;
> -#endif
> -}
> -
> -/*
> - * Check if autoload is enabled. If so, use either NFS or TFTP to download
> - * the boot file.
> - */
> -void net_auto_load(void);
> -
> -/*
> - * The following functions are a bit ugly, but necessary to deal with
> - * alignment restrictions on ARM.
> - *
> - * We're using inline functions, which had the smallest memory
> - * footprint in our tests.
> - */
> -/* return IP *in network byteorder* */
> -static inline struct in_addr net_read_ip(void *from)
> -{
> -       struct in_addr ip;
> -
> -       memcpy((void *)&ip, (void *)from, sizeof(ip));
> -       return ip;
> -}
> -
> -/* return ulong *in network byteorder* */
> -static inline u32 net_read_u32(void *from)
> -{
> -       u32 l;
> -
> -       memcpy((void *)&l, (void *)from, sizeof(l));
> -       return l;
> -}
> -
> -/* write IP *in network byteorder* */
> -static inline void net_write_ip(void *to, struct in_addr ip)
> -{
> -       memcpy(to, (void *)&ip, sizeof(ip));
> -}
> -
> -/* copy IP */
> -static inline void net_copy_ip(void *to, void *from)
> -{
> -       memcpy((void *)to, from, sizeof(struct in_addr));
> -}
> -
> -/* copy ulong */
> -static inline void net_copy_u32(void *to, void *from)
> -{
> -       memcpy((void *)to, (void *)from, sizeof(u32));
> -}
> -
> -/**
> - * is_zero_ethaddr - Determine if give Ethernet address is all zeros.
> - * @addr: Pointer to a six-byte array containing the Ethernet address
> - *
> - * Return true if the address is all zeroes.
> - */
> -static inline int is_zero_ethaddr(const u8 *addr)
> -{
> -       return !(addr[0] | addr[1] | addr[2] | addr[3] | addr[4] | addr[5]);
> -}
> -
> -/**
> - * is_multicast_ethaddr - Determine if the Ethernet address is a multicast.
> - * @addr: Pointer to a six-byte array containing the Ethernet address
> - *
> - * Return true if the address is a multicast address.
> - * By definition the broadcast address is also a multicast address.
> - */
> -static inline int is_multicast_ethaddr(const u8 *addr)
> -{
> -       return 0x01 & addr[0];
> -}
> -
> -/*
> - * is_broadcast_ethaddr - Determine if the Ethernet address is broadcast
> - * @addr: Pointer to a six-byte array containing the Ethernet address
> - *
> - * Return true if the address is the broadcast address.
> - */
> -static inline int is_broadcast_ethaddr(const u8 *addr)
> -{
> -       return (addr[0] & addr[1] & addr[2] & addr[3] & addr[4] & addr[5]) ==
> -               0xff;
> -}
> -
> -/*
> - * is_valid_ethaddr - Determine if the given Ethernet address is valid
> - * @addr: Pointer to a six-byte array containing the Ethernet address
> - *
> - * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
> - * a multicast address, and is not FF:FF:FF:FF:FF:FF.
> - *
> - * Return true if the address is valid.
> - */
> -static inline int is_valid_ethaddr(const u8 *addr)
> -{
> -       /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
> -        * explicitly check for it here. */
> -       return !is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr);
> -}
> -
> -/**
> - * net_random_ethaddr - Generate software assigned random Ethernet address
> - * @addr: Pointer to a six-byte array containing the Ethernet address
> - *
> - * Generate a random Ethernet address (MAC) that is not multicast
> - * and has the local assigned bit set.
> - */
> -static inline void net_random_ethaddr(uchar *addr)
> -{
> -       int i;
> -       unsigned int seed = get_ticks();
> -
> -       for (i = 0; i < 6; i++)
> -               addr[i] = rand_r(&seed);
> -
> -       addr[0] &= 0xfe;        /* clear multicast bit */
> -       addr[0] |= 0x02;        /* set local assignment bit (IEEE802) */
> -}
> -
> -/**
> - * string_to_enetaddr() - Parse a MAC address
> - *
> - * Convert a string MAC address
> - *
> - * Implemented in lib/net_utils.c (built unconditionally)
> - *
> - * @addr: MAC address in aa:bb:cc:dd:ee:ff format, where each part is a 2-digit
> - *     hex value
> - * @enetaddr: Place to put MAC address (6 bytes)
> - */
> -void string_to_enetaddr(const char *addr, uint8_t *enetaddr);
> -
> -/* Convert an IP address to a string */
> -void ip_to_string(struct in_addr x, char *s);
> -
> -/**
> - * string_to_ip() - Convert a string to ip address
> - *
> - * Implemented in lib/net_utils.c (built unconditionally)
> - *
> - * @s: Input string to parse
> - * @return: in_addr struct containing the parsed IP address
> - */
> -struct in_addr string_to_ip(const char *s);
> -
> -/* Convert a VLAN id to a string */
> -void vlan_to_string(ushort x, char *s);
> -
> -/* Convert a string to a vlan id */
> -ushort string_to_vlan(const char *s);
> -
> -/* read a VLAN id from an environment variable */
> -ushort env_get_vlan(char *);
> -
> -/* copy a filename (allow for "..." notation, limit length) */
> -void copy_filename(char *dst, const char *src, int size);
> -
> -/* check if serverip is specified in filename from the command line */
> -int is_serverip_in_cmd(void);
> -
> -/**
> - * net_parse_bootfile - Parse the bootfile env var / cmd line param
> - *
> - * @param ipaddr - a pointer to the ipaddr to populate if included in bootfile
> - * @param filename - a pointer to the string to save the filename part
> - * @param max_len - The longest - 1 that the filename part can be
> - *
> - * return 1 if parsed, 0 if bootfile is empty
> - */
> -int net_parse_bootfile(struct in_addr *ipaddr, char *filename, int max_len);
> -
> -/**
> - * update_tftp - Update firmware over TFTP (via DFU)
> - *
> - * This function updates board's firmware via TFTP
> - *
> - * @param addr - memory address where data is stored
> - * @param interface - the DFU medium name - e.g. "mmc"
> - * @param devstring - the DFU medium number - e.g. "1"
> - *
> - * Return: - 0 on success, other value on failure
> - */
> -int update_tftp(ulong addr, char *interface, char *devstring);
> -
> -/**
> - * env_get_ip() - Convert an environment value to to an ip address
> - *
> - * @var: Environment variable to convert. The value of this variable must be
> - *     in the format format a.b.c.d, where each value is a decimal number from
> - *     0 to 255
> - * Return: IP address, or 0 if invalid
> - */
> -static inline struct in_addr env_get_ip(char *var)
> -{
> -       return string_to_ip(env_get(var));
> -}
> -
> -/**
> - * reset_phy() - Reset the Ethernet PHY
> - *
> - * This should be implemented by boards if CONFIG_RESET_PHY_R is enabled
> - */
> -void reset_phy(void);
> -
> -#if CONFIG_IS_ENABLED(NET)
> -/**
> - * eth_set_enable_bootdevs() - Enable or disable binding of Ethernet bootdevs
> - *
> - * These get in the way of bootstd testing, so are normally disabled by tests.
> - * This provide control of this setting. It only affects binding of Ethernet
> - * devices, so if that has already happened, this flag does nothing.
> - *
> - * @enable: true to enable binding of bootdevs when binding new Ethernet
> - * devices, false to disable it
> - */
> -void eth_set_enable_bootdevs(bool enable);
> -#else
> -static inline void eth_set_enable_bootdevs(bool enable) {}
> -#endif
> -
> -/**
> - * wget_with_dns() - runs dns host IP address resulution before wget
> - *
> - * @dst_addr:  destination address to download the file
> - * @uri:       uri string of target file of wget
> - * Return:     downloaded file size, negative if failed
> - */
> -int wget_with_dns(ulong dst_addr, char *uri);
> -
> -/**
> - * wget_validate_uri() - varidate the uri
> - *
> - * @uri:       uri string of target file of wget
> - * Return:     true if uri is valid, false if uri is invalid
> - */
> -bool wget_validate_uri(char *uri);
>
>  #endif /* __NET_H__ */
> --
> 2.40.1
>

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig
  2024-10-03 15:46 ` [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig Jerome Forissier
@ 2024-10-04  6:01   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:01 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Simon Glass

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> The tools-only defconfig causes troubles on MacOSX due to the default
> C compiler being Clang (LLVM) rather than GCC and more specifically
> due to [1]. Therefore replace "# CONFIG_FOO is not set" with the
> equivalent "CONFIG_FOO=n" using the following command:
>
>  $ sed -i -e 's/# \(CONFIG_[^ ]*\) is not set/\1=n/' \
>        configs/tools-only_defconfig
>
> This fixes the tools_only_macOS CI job on GitHub [2].
>
> [1] https://github.com/llvm/llvm-project/issues/78778
> [2] https://dev.azure.com/u-boot/u-boot/_build/results?buildId=9105&view=results
>
> Suggested-by: Tom Rini <trini@konsulko.com>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> Reviewed-by: Tom Rini <trini@konsulko.com>
> ---
>  configs/tools-only_defconfig | 32 ++++++++++++++++----------------
>  1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/configs/tools-only_defconfig b/configs/tools-only_defconfig
> index e00f2c48598..7511e30d709 100644
> --- a/configs/tools-only_defconfig
> +++ b/configs/tools-only_defconfig
> @@ -4,26 +4,26 @@ CONFIG_ENV_SIZE=0x2000
>  CONFIG_DEFAULT_DEVICE_TREE="sandbox"
>  CONFIG_SYS_LOAD_ADDR=0x0
>  CONFIG_PCI=y
> -# CONFIG_SANDBOX_SDL is not set
> +CONFIG_SANDBOX_SDL=n
>  CONFIG_ANDROID_BOOT_IMAGE=y
>  CONFIG_TIMESTAMP=y
>  CONFIG_FIT=y
>  CONFIG_FIT_SIGNATURE=y
> -# CONFIG_BOOTSTD_FULL is not set
> -# CONFIG_BOOTMETH_CROS is not set
> -# CONFIG_BOOTMETH_VBE is not set
> +CONFIG_BOOTSTD_FULL=n
> +CONFIG_BOOTMETH_CROS=n
> +CONFIG_BOOTMETH_VBE=n
>  CONFIG_USE_BOOTCOMMAND=y
>  CONFIG_BOOTCOMMAND="run distro_bootcmd"
> -# CONFIG_CMD_BOOTD is not set
> -# CONFIG_CMD_BOOTM is not set
> -# CONFIG_CMD_BOOTI is not set
> -# CONFIG_CMD_ELF is not set
> -# CONFIG_CMD_EXTENSION is not set
> -# CONFIG_CMD_DATE is not set
> +CONFIG_CMD_BOOTD=n
> +CONFIG_CMD_BOOTM=n
> +CONFIG_CMD_BOOTI=n
> +CONFIG_CMD_ELF=n
> +CONFIG_CMD_EXTENSION=n
> +CONFIG_CMD_DATE=n
>  CONFIG_OF_CONTROL=y
>  CONFIG_SYS_RELOC_GD_ENV_ADDR=y
>  CONFIG_NO_NET=y
> -# CONFIG_ACPIGEN is not set
> +CONFIG_ACPIGEN=n
>  CONFIG_AXI=y
>  CONFIG_AXI_SANDBOX=y
>  CONFIG_SANDBOX_GPIO=y
> @@ -32,9 +32,9 @@ CONFIG_DM_RTC=y
>  CONFIG_SOUND=y
>  CONFIG_SYSRESET=y
>  CONFIG_TIMER=y
> -# CONFIG_VIRTIO_MMIO is not set
> -# CONFIG_VIRTIO_PCI is not set
> -# CONFIG_VIRTIO_SANDBOX is not set
> -# CONFIG_GENERATE_ACPI_TABLE is not set
> -# CONFIG_EFI_LOADER is not set
> +CONFIG_VIRTIO_MMIO=n
> +CONFIG_VIRTIO_PCI=n
> +CONFIG_VIRTIO_SANDBOX=n
> +CONFIG_GENERATE_ACPI_TABLE=n
> +CONFIG_EFI_LOADER=n
>  CONFIG_TOOLS_MKEFICAPSULE=y
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev()
  2024-10-03 15:22 ` [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev() Jerome Forissier
@ 2024-10-04  6:04   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:04 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Masahisa Kojima, Simon Glass, Sean Anderson, Marek Vasut,
	Matthias Schiffer, Fabio Estevam, Michal Simek

On Thu, 3 Oct 2024 at 18:24, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Add a function to start a given network device, and update eth_init()
> to use it.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  include/net-common.h |  1 +
>  net/eth-uclass.c     | 38 +++++++++++++++++++++++++-------------
>  2 files changed, 26 insertions(+), 13 deletions(-)
>
> diff --git a/include/net-common.h b/include/net-common.h
> index 543f528a4a4..6bc76658d9d 100644
> --- a/include/net-common.h
> +++ b/include/net-common.h
> @@ -192,6 +192,7 @@ int eth_env_set_enetaddr_by_index(const char *base_name, int index,
>  int usb_ether_init(void);
>
>  int eth_init(void);                    /* Initialize the device */
> +int eth_start_udev(struct udevice *dev); /* ->start() if not already running */
>  int eth_send(void *packet, int length);           /* Send a packet */
>  #if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
>  int eth_receive(void *packet, int length); /* Receive a packet*/
> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
> index e34d7af0229..5555f82f23e 100644
> --- a/net/eth-uclass.c
> +++ b/net/eth-uclass.c
> @@ -284,6 +284,27 @@ static int on_ethaddr(const char *name, const char *value, enum env_op op,
>  }
>  U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr);
>
> +int eth_start_udev(struct udevice *dev)
> +{
> +       struct eth_device_priv *priv = dev_get_uclass_priv(dev);
> +       int ret;
> +
> +       if (priv->running)
> +               return 0;
> +
> +       if (!device_active(dev))
> +               return -EINVAL;
> +
> +       ret = eth_get_ops(dev)->start(dev);
> +       if (ret < 0)
> +               return ret;
> +
> +       priv->state = ETH_STATE_ACTIVE;
> +       priv->running = true;
> +
> +       return 0;
> +}
> +
>  int eth_init(void)
>  {
>         struct udevice *current = NULL;
> @@ -328,20 +349,11 @@ int eth_init(void)
>                 if (current) {
>                         debug("Trying %s\n", current->name);
>
> -                       if (device_active(current)) {
> -                               ret = eth_get_ops(current)->start(current);
> -                               if (ret >= 0) {
> -                                       struct eth_device_priv *priv =
> -                                               dev_get_uclass_priv(current);
> -
> -                                       priv->state = ETH_STATE_ACTIVE;
> -                                       priv->running = true;
> -                                       ret = 0;
> -                                       goto end;
> -                               }
> -                       } else {
> +                       ret = eth_start_udev(current);
> +                       if (ret < 0)
>                                 ret = eth_errno;
> -                       }
> +                       else
> +                               break;
>
>                         debug("FAIL\n");
>                 } else {
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100
  2024-10-03 15:47 ` [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100 Jerome Forissier
@ 2024-10-04  6:05   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:05 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Chia-Wei Wang, Maxim Sloyko, Tom Rini

On Thu, 3 Oct 2024 at 18:48, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> FTGMAC100 is not compatible with NET_LWIP which was enabled as the
> default stack in a previous commit. So enable NET in the defconfig.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> Reviewed-by: Chia-Wei Wang <chiawei_wang@aspeedtech.com>
> ---
>  configs/evb-ast2500_defconfig | 1 +
>  configs/evb-ast2600_defconfig | 1 +
>  2 files changed, 2 insertions(+)
>
> diff --git a/configs/evb-ast2500_defconfig b/configs/evb-ast2500_defconfig
> index 6685f37e3f5..d20ccf16797 100644
> --- a/configs/evb-ast2500_defconfig
> +++ b/configs/evb-ast2500_defconfig
> @@ -35,6 +35,7 @@ CONFIG_CMD_NCSI=y
>  CONFIG_ENV_OVERWRITE=y
>  CONFIG_ENV_IS_IN_SPI_FLASH=y
>  CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_NET=y
>  CONFIG_NET_RANDOM_ETHADDR=y
>  CONFIG_REGMAP=y
>  CONFIG_CLK=y
> diff --git a/configs/evb-ast2600_defconfig b/configs/evb-ast2600_defconfig
> index e6a4e4d1b7c..47faf05a242 100644
> --- a/configs/evb-ast2600_defconfig
> +++ b/configs/evb-ast2600_defconfig
> @@ -78,6 +78,7 @@ CONFIG_ENV_OVERWRITE=y
>  CONFIG_ENV_IS_IN_SPI_FLASH=y
>  CONFIG_ENV_SECT_SIZE_AUTO=y
>  CONFIG_SYS_RELOC_GD_ENV_ADDR=y
> +CONFIG_NET=y
>  CONFIG_NET_RANDOM_ETHADDR=y
>  CONFIG_SPL_DM=y
>  CONFIG_SPL_DM_SEQ_ALIAS=y
> --
> 2.40.1
>

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix
  2024-10-03 15:46 ` [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
@ 2024-10-04  6:05   ` Ilias Apalodimas
  2024-10-04 18:25   ` Tom Rini
  1 sibling, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:05 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Simon Glass, Jiaxun Yang,
	Heinrich Schuchardt

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Build and run qemu_arm64_lwip_defconfig in CI. This tests the lightweight
> IP (lwIP) implementation of the dhcp, tftpboot and ping commands.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  .azure-pipelines.yml | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml
> index 93111eb6127..59fddb96a48 100644
> --- a/.azure-pipelines.yml
> +++ b/.azure-pipelines.yml
> @@ -238,6 +238,10 @@ stages:
>            cd \${WORK_DIR}
>            git config --global --add safe.directory \${WORK_DIR}
>            git clone --depth=1 https://source.denx.de/u-boot/u-boot-test-hooks /tmp/uboot-test-hooks
> +          # qemu_arm64_lwip_defconfig is the same as qemu_arm64 but with NET_LWIP enabled.
> +          # The test config and the boardenv file from qemu_arm64 can be re-used so create symlinks
> +          ln -s conf.qemu_arm64_na /tmp/uboot-test-hooks/bin/travis-ci/conf.qemu_arm64_lwip_na
> +          ln -s u_boot_boardenv_qemu_arm64_na.py /tmp/uboot-test-hooks/py/travis-ci/u_boot_boardenv_qemu_arm64_lwip_na.py
>            ln -s travis-ci /tmp/uboot-test-hooks/bin/\`hostname\`
>            ln -s travis-ci /tmp/uboot-test-hooks/py/\`hostname\`
>            grub-mkimage --prefix=\"\" -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
> @@ -415,6 +419,9 @@ stages:
>          qemu_arm64:
>            TEST_PY_BD: "qemu_arm64"
>            TEST_PY_TEST_SPEC: "not sleep"
> +        qemu_arm64_lwip:
> +          TEST_PY_BD: "qemu_arm64_lwip"
> +          TEST_PY_TEST_SPEC: "test_net_dhcp or test_net_ping or test_net_tftpboot"
>          qemu_m68k:
>            TEST_PY_BD: "M5208EVBE"
>            TEST_PY_ID: "--id qemu"
> --
> 2.40.1
>
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode
  2024-10-03 15:46 ` [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode Jerome Forissier
@ 2024-10-04  6:11   ` Ilias Apalodimas
  2024-10-04  9:07     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:11 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini

Hi Jerome,

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> The TFTP app should not bind to the TFTP server port when configured as
> a client. Instead, the local port should be chosen from the dynamic
> range (49152 ~ 65535) so that if the application is stopped and started
> again, the remote server will not consider the new packets as part of
> the same context (which would cause an error since a new RRQ would be
> unexpected).
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  lib/lwip/lwip/src/apps/tftp/tftp.c | 10 ++++++----
>  1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
> index ddfdbfc0c1b..74fc1fbe586 100644
> --- a/lib/lwip/lwip/src/apps/tftp/tftp.c
> +++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
> @@ -454,10 +454,12 @@ tftp_init_common(u8_t mode, const struct tftp_context *ctx)
>      return ERR_MEM;
>    }
>
> -  ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
> -  if (ret != ERR_OK) {
> -    udp_remove(pcb);
> -    return ret;
> +  if (mode == LWIP_TFTP_MODE_SERVER) {
> +    ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
> +    if (ret != ERR_OK) {
> +      udp_remove(pcb);
> +      return ret;
> +    }

This should be sent to lwip as well right?

>    }
>
>    tftp_state.handle    = NULL;
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 23/29] lwip: tftp: add support of blksize option to client
  2024-10-03 15:46 ` [PATCH v11 23/29] lwip: tftp: add support of blksize option to client Jerome Forissier
@ 2024-10-04  6:41   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:41 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini

Hi Jerome,

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> The TFTP protocol uses a default block size of 512 bytes. This value is
> sub-optimal for ethernet devices, which have a MTU (Maximum Transmission
> Unit) of 1500 bytes. When taking into acount the overhead of the IP and
> UDP layers, this leaves 1468 bytes for the TFTP payload.
>
> This patch introduces a new function: tftp_client_set_blksize() which
> may be used to change the block size from the default. It has to be
> called after tftp_client_init() and before tftp_get(). If the server
> does not support the option, the client will still accept to receive
> 512-byte blocks.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  lib/lwip/lwip/src/apps/tftp/tftp.c            | 94 +++++++++++++++++--
>  .../lwip/src/include/lwip/apps/tftp_client.h  |  1 +
>  2 files changed, 89 insertions(+), 6 deletions(-)
>
> diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
> index 74fc1fbe586..8e0c071772a 100644
> --- a/lib/lwip/lwip/src/apps/tftp/tftp.c
> +++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
> @@ -57,7 +57,7 @@
>  #include "lwip/timeouts.h"
>  #include "lwip/debug.h"
>
> -#define TFTP_MAX_PAYLOAD_SIZE 512
> +#define TFTP_DEFAULT_BLOCK_SIZE 512
>  #define TFTP_HEADER_LENGTH    4
>
>  #define TFTP_RRQ   1
> @@ -65,6 +65,7 @@
>  #define TFTP_DATA  3
>  #define TFTP_ACK   4
>  #define TFTP_ERROR 5
> +#define TFTP_OACK  6
>
>  enum tftp_error {
>    TFTP_ERROR_FILE_NOT_FOUND    = 1,
> @@ -88,9 +89,11 @@ struct tftp_state {
>    int timer;
>    int last_pkt;
>    u16_t blknum;
> +  u16_t blksize;
>    u8_t retries;
>    u8_t mode_write;
>    u8_t tftp_mode;
> +  bool wait_oack;
>  };
>
>  static struct tftp_state tftp_state;
> @@ -137,10 +140,24 @@ send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname,
>  {
>    size_t fname_length = strlen(fname)+1;
>    size_t mode_length = strlen(mode)+1;
> -  struct pbuf* p = init_packet(opcode, 0, fname_length + mode_length - 2);
> +  size_t blksize_length = 0;
> +  struct pbuf* p;
>    char* payload;
>    err_t ret;
>
> +  if (tftp_state.blksize) {
> +    blksize_length = 14; /* maximum (blksize is a u16_t): 'blksize\0XXXXX\0' */
> +    if (tftp_state.blksize < 10000)
> +           blksize_length--;
> +    if (tftp_state.blksize < 1000)
> +           blksize_length--;
> +    if (tftp_state.blksize < 100)
> +           blksize_length--;
> +    if (tftp_state.blksize < 10)
> +           blksize_length--;
> +  }

I don't think we have log10 anywhere in u-boot but I think writing this as
blksize_length = strlen("blksize") + 1;
int cnt = 0;
int blksize = tftp_state.blksize;
while (blksize > 10) {
      blksize /= 10;
      cnt++;
}
cnt++;

is a bit easier to read

> +
> +  p = init_packet(opcode, 0, fname_length + mode_length + blksize_length - 2);
>    if (p == NULL) {
>      return ERR_MEM;
>    }
> @@ -148,7 +165,10 @@ send_request(const ip_addr_t *addr, u16_t port, u16_t opcode, const char* fname,
>    payload = (char*) p->payload;
>    MEMCPY(payload+2,              fname, fname_length);
>    MEMCPY(payload+2+fname_length, mode,  mode_length);
> +  if (tftp_state.blksize)
> +    sprintf(payload+2+fname_length+mode_length, "blksize%c%d%c", 0, tftp_state.blksize, 0);
>
> +  tftp_state.wait_oack = true;
>    ret = udp_sendto(tftp_state.upcb, p, addr, port);
>    pbuf_free(p);
>    return ret;
> @@ -221,14 +241,14 @@ send_data(const ip_addr_t *addr, u16_t port)
>      pbuf_free(tftp_state.last_data);
>    }
>
> -  tftp_state.last_data = init_packet(TFTP_DATA, tftp_state.blknum, TFTP_MAX_PAYLOAD_SIZE);
> +  tftp_state.last_data = init_packet(TFTP_DATA, tftp_state.blknum, TFTP_DEFAULT_BLOCK_SIZE);
>    if (tftp_state.last_data == NULL) {
>      return;
>    }
>
>    payload = (u16_t *) tftp_state.last_data->payload;
>
> -  ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_MAX_PAYLOAD_SIZE);
> +  ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_DEFAULT_BLOCK_SIZE);
>    if (ret < 0) {
>      send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, "Error occurred while reading the file.");
>      close_handle();
> @@ -239,6 +259,28 @@ send_data(const ip_addr_t *addr, u16_t port)
>    resend_data(addr, port);
>  }
>
> +static u16_t payload_size(void)
> +{
> +  if (tftp_state.blksize)
> +    return tftp_state.blksize;
> +  return TFTP_DEFAULT_BLOCK_SIZE;
> +}
> +
> +static const char *
> +find_option(struct pbuf *p, const char *option)
> +{
> +  int i;
> +  u16_t optlen = strlen(option);
> +  const char *b = p->payload;
> +
> +  for (i = 0; i + optlen + 1 < p->len; i++) {
> +    if (lwip_strnstr(b + i, option, optlen))
> +      return b + i + optlen + 2;
> +  }
> +
> +  return NULL;
> +}
> +
>  static void
>  tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
>  {
> @@ -338,6 +380,15 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
>        }
>
>        blknum = lwip_ntohs(sbuf[1]);
> +      if (tftp_state.blksize && tftp_state.wait_oack) {
> +        /*
> +         * Data received while we are expecting an OACK for our blksize option.
> +         * This means the server doesn't support it, let's switch back to the
> +         * default block size.
> +         */
> +       tftp_state.blksize = 0;
> +       tftp_state.wait_oack = false;
> +      }
>        if (blknum == tftp_state.blknum) {
>          pbuf_remove_header(p, TFTP_HEADER_LENGTH);
>
> @@ -349,7 +400,7 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
>            send_ack(addr, port, blknum);
>          }
>
> -        if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {
> +        if (p->tot_len < payload_size()) {
>            close_handle();
>          } else {
>            tftp_state.blknum++;
> @@ -386,7 +437,7 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
>        lastpkt = 0;
>
>        if (tftp_state.last_data != NULL) {
> -        lastpkt = tftp_state.last_data->tot_len != (TFTP_MAX_PAYLOAD_SIZE + TFTP_HEADER_LENGTH);
> +        lastpkt = tftp_state.last_data->tot_len != (TFTP_DEFAULT_BLOCK_SIZE + TFTP_HEADER_LENGTH);
>        }
>
>        if (!lastpkt) {
> @@ -405,6 +456,25 @@ tftp_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr
>          close_handle();
>        }
>        break;
> +    case PP_HTONS(TFTP_OACK): {
> +      const char *optval = find_option(p, "blksize");
> +      u16_t srv_blksize = 0;
> +      tftp_state.wait_oack = false;
> +      if (optval) {
> +       if (!tftp_state.blksize) {
> +         /* We did not request this option */
> +          send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "blksize unexpected");
> +       }
> +       srv_blksize = atoi(optval);
> +       if (srv_blksize <= 0 || srv_blksize > tftp_state.blksize) {
> +         send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Invalid blksize");
> +       }
> +       LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, ("tftp: accepting blksize=%d\n", srv_blksize));
> +       tftp_state.blksize = srv_blksize;
> +      }
> +      send_ack(addr, port, 0);
> +      break;
> +    }
>      default:
>        send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, "Unknown operation");
>        break;
> @@ -495,6 +565,18 @@ tftp_init_client(const struct tftp_context *ctx)
>    return tftp_init_common(LWIP_TFTP_MODE_CLIENT, ctx);
>  }
>
> +/** @ingroup tftp
> + * Set the block size to be used by the TFTP client. The server may choose to
> + * accept a lower value.
> + * @param blksize Block size in bytes
> + */
> +void
> +tftp_client_set_blksize(u16_t blksize)
> +{
> +  if (blksize != TFTP_DEFAULT_BLOCK_SIZE)
> +    tftp_state.blksize = blksize;
> +}
> +
>  /** @ingroup tftp
>   * Deinitialize ("turn off") TFTP client/server.
>   */
> diff --git a/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h b/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
> index 24dbda6a8c9..e1e21d06b67 100644
> --- a/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
> +++ b/lib/lwip/lwip/src/include/lwip/apps/tftp_client.h
> @@ -44,6 +44,7 @@ enum tftp_transfer_mode {
>  };
>
>  err_t tftp_init_client(const struct tftp_context* ctx);
> +void tftp_client_set_blksize(u16_t blksize);
>  err_t tftp_get(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
>  err_t tftp_put(void* handle, const ip_addr_t *addr, u16_t port, const char* fname, enum tftp_transfer_mode mode);
>
> --
> 2.40.1
>

I am fine with it as is since this has to be merged in LWIP anyway.
The refactoring above can go in a new patch if we decide to merge this
now.

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand
  2024-10-03 15:46 ` [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand Jerome Forissier
@ 2024-10-04  6:50   ` Ilias Apalodimas
  2024-10-04  8:43     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:50 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Manoj Sai, Matteo Lisi, Tom Rini, Gilles Talis,
	Michal Simek, Marek Vasut, Joe Hershberger, Ramon Fried, Peng Fan,
	Nishanth Menon, Simon Glass, Sughosh Ganu, Padmarao Begari,
	Venkatesh Yadav Abbarapu, James Hilliard, Petr Zejdl,
	Mattijs Korpershoek, Heinrich Schuchardt, AKASHI Takahiro,
	Francis Laniel, Maxim Moskalets, Sean Anderson, Rasmus Villemoes,
	Artur Rojek, Janne Grunau, Neal Gompa, Yang Xiwen, Boon Khai Ng,
	Robert Marko, Philip Oberfichtner, Jonas Karlman, Masahisa Kojima

Hi Jerome,

[...]


> +#define DHCP_TIMEOUT_MS 10000
> +
> +#ifdef CONFIG_CMD_TFTPBOOT
> +/* Boot file obtained from DHCP (if present) */
> +static char boot_file_name[DHCP_BOOT_FILE_LEN];
> +#endif
> +
> +static void call_lwip_dhcp_fine_tmr(void *ctx)
> +{
> +       dhcp_fine_tmr();
> +       sys_timeout(10, call_lwip_dhcp_fine_tmr, NULL);
> +}
> +
> +static int dhcp_loop(struct udevice *udev)
> +{
> +       char *ipstr = "ipaddr\0\0";
> +       char *maskstr = "netmask\0\0";
> +       char *gwstr = "gatewayip\0\0";
> +       unsigned long start;
> +       struct netif *netif;
> +       struct dhcp *dhcp;
> +       bool bound;
> +       int idx;
> +
> +       idx = dev_seq(udev);
> +       if (idx < 0 || idx > 99) {
> +               log_err("unexpected idx %d\n", idx);
> +               return CMD_RET_FAILURE;
> +       }
> +
> +       netif = net_lwip_new_netif_noip(udev);
> +       if (!netif)
> +               return CMD_RET_FAILURE;
> +
> +       start = get_timer(0);
> +       dhcp_start(netif);

This can fail. Don't we have to check that and exit?

> +       call_lwip_dhcp_fine_tmr(NULL);
> +
> +       /* Wait for DHCP to complete */
> +       do {
> +               net_lwip_rx(udev, netif);
> +               sys_check_timeouts();
> +               bound = dhcp_supplied_address(netif);
> +               if (bound)
> +                       break;
> +               if (ctrlc()) {
> +                       printf("Abort\n");
> +                       break;
> +               }
> +               mdelay(1);
> +       } while (get_timer(start) < DHCP_TIMEOUT_MS);
> +
> +       sys_untimeout(call_lwip_dhcp_fine_tmr, NULL);
> +

[...]

> +       free(pp);
> +       if (err) {
> +               log_err("send error %d\n", err);
> +               return ERR_ABRT;
> +       }
> +
> +       return ERR_OK;
> +}
> +
> +static err_t net_lwip_if_init(struct netif *netif)
> +{
> +#if LWIP_IPV4

Do we ever not set this?

> +       netif->output = etharp_output;
> +#endif
> +       netif->linkoutput = linkoutput;
> +       netif->mtu = 1500;
> +       netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
> +
> +       return ERR_OK;
> +}
> +
> +static void eth_init_rings(void)
> +{
> +       int i;
> +
> +       for (i = 0; i < PKTBUFSRX; i++)
> +               net_rx_packets[i] = net_pkt_buf + i  * PKTSIZE_ALIGN;
> +}
> +
> +struct netif *net_lwip_get_netif(void)
> +{
> +       struct netif *netif, *found = NULL;
> +
> +       NETIF_FOREACH(netif) {
> +               if (!found)
> +                       found = netif;
> +               else
> +                       printf("Error: more than one netif in lwIP\n");
> +       }
> +       return found;
> +}
> +
> +static int get_udev_ipv4_info(struct udevice *dev, ip4_addr_t *ip,
> +                             ip4_addr_t *mask, ip4_addr_t *gw)
> +{
> +       char *ipstr = "ipaddr\0\0";
> +       char *maskstr = "netmask\0\0";
> +       char *gwstr = "gatewayip\0\0";
> +       int idx = dev_seq(dev);
> +       char *env;
> +
> +       if (idx < 0 || idx > 99) {
> +               log_err("unexpected idx %d\n", idx);
> +               return -1;
> +       }
> +

[...]

FWIW dhcp seems to work fine

Tested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

Thanks
/Ilias

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c
  2024-10-03 15:22 ` [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c Jerome Forissier
@ 2024-10-04  6:52   ` Ilias Apalodimas
  2024-10-04  8:01     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:52 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Simon Glass, Sean Anderson, Marek Vasut

On Thu, 3 Oct 2024 at 18:24, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> copy_filename() can be useful when NET_LWIP is enabled, therefore
> move it out of net/net.c which is built only when networking choice
> is NET.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  net/Makefile     |  2 ++
>  net/net-common.c | 13 +++++++++++++
>  net/net.c        | 12 ------------
>  3 files changed, 15 insertions(+), 12 deletions(-)
>  create mode 100644 net/net-common.c
>
> diff --git a/net/Makefile b/net/Makefile
> index 70eec8caf0d..a9cecee637a 100644
> --- a/net/Makefile
> +++ b/net/Makefile
> @@ -42,3 +42,5 @@ obj-$(CONFIG_CMD_WGET) += wget.o
>  CFLAGS_eth_common.o += -Wno-format-extra-args
>
>  endif
> +
> +obj-y += net-common.o

This seems to belong in the net-common split patch?

> diff --git a/net/net-common.c b/net/net-common.c
> new file mode 100644
> index 00000000000..a7f767d5e9c
> --- /dev/null
> +++ b/net/net-common.c
> @@ -0,0 +1,13 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +void copy_filename(char *dst, const char *src, int size)
> +{
> +       if (src && *src && (*src == '"')) {
> +               ++src;
> +               --size;
> +       }
> +
> +       while ((--size > 0) && src && *src && (*src != '"'))
> +               *dst++ = *src++;
> +       *dst = '\0';
> +}
> diff --git a/net/net.c b/net/net.c
> index 1e0b7c85624..c1d10a77b9e 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -1689,18 +1689,6 @@ void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport, int sport,
>         ip->udp_xsum = 0;
>  }
>
> -void copy_filename(char *dst, const char *src, int size)
> -{
> -       if (src && *src && (*src == '"')) {
> -               ++src;
> -               --size;
> -       }
> -
> -       while ((--size > 0) && src && *src && (*src != '"'))
> -               *dst++ = *src++;
> -       *dst = '\0';
> -}
> -
>  int is_serverip_in_cmd(void)
>  {
>         return !!strchr(net_boot_file_name, ':');
> --
> 2.40.1
>

With the the above fixed
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-03 15:22 ` [PATCH v11 06/29] test: boot: fix bootflow_cmd_label " Jerome Forissier
@ 2024-10-04  6:55   ` Ilias Apalodimas
  2024-10-04  8:46     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  6:55 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Simon Glass, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel

Hi Jerome,

On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
>
>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
>  [...]
>  Scanning for bootflows with label '9'
>  [...]
>  Cannot find '9' (err=-19)
>
> This is due to the device list containing two less entries than
> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
>
> The actual use case is NET_LWIP=y (to be introduced in later patches)
> which implies DSA_SANDBOX=n for the time being.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  test/boot/bootflow.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> index 6ad63afe90a..c440b8eb778 100644
> --- a/test/boot/bootflow.c
> +++ b/test/boot/bootflow.c
> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
>          * 8   [   ]      OK  mmc       mmc2.bootdev
>          * 9   [ + ]      OK  mmc       mmc1.bootdev
>          * a   [   ]      OK  mmc       mmc0.bootdev
> +        *
> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
> +        * dsa-test@1).
>          */
> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
> -       ut_assert_nextline("Scanning for bootflows with label '9'");

Shouldn't this under and #ifdef, IS_ENABLED etc?

> +       ut_assertok(run_command("bootflow scan -lH 7", 0));
> +       ut_assert_nextline("Scanning for bootflows with label '7'");
>         ut_assert_skip_to_line("(1 bootflow, 1 valid)");
>
>         ut_assertok(run_command("bootflow scan -lH 0", 0));
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it.
  2024-10-03 15:46 ` [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it Jerome Forissier
@ 2024-10-04  7:11   ` Ilias Apalodimas
  2024-10-04  8:36     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  7:11 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Jonathan Humphreys, Joe Hershberger, Ramon Fried,
	Tom Rini

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> From: Jonathan Humphreys <j-humphreys@ti.com>

A short description is missing here

Thanks
/Ilias
>
> Signed-off-by: Jonathan Humphreys <j-humphreys@ti.com>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  net/lwip/wget.c | 6 ------
>  1 file changed, 6 deletions(-)
>
> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
> index e8768fc2acd..b495ebd1aa9 100644
> --- a/net/lwip/wget.c
> +++ b/net/lwip/wget.c
> @@ -349,12 +349,6 @@ bool wget_validate_uri(char *uri)
>                 ret = false;
>                 goto out;
>         }
> -       s = strchr(authority, ':');
> -       if (s) {
> -               log_err("user defined port is not supported\n");
> -               ret = false;
> -               goto out;
> -       }
>
>  out:
>         free(str_copy);
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-03 15:22 ` [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64 Jerome Forissier
@ 2024-10-04  7:12   ` Ilias Apalodimas
  2024-10-04 12:04   ` Heinrich Schuchardt
  1 sibling, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  7:12 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Simon Glass, Jiaxun Yang,
	Heinrich Schuchardt, Dan Carpenter, Alexander Gendin

On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Note: Patch posted separately [0].
>
> [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>
> CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
> exception may occur. Fixes an issue found on malta64 with QEMU:
>
>  Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
>  31                      if (!strcmp(name, entry->name))
>  [...]
>  ld      a1,0(s0)
>
>  (gdb) p/x &entry->name
>  0xffffffffbe04b0d4
>  (gdb) p/x $s0
>  0xffffffffbe04b0d4
>
>  $ grep __u_boot_list /tmp/malta64/u-boot.objdump
>  4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  arch/Kconfig | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 8f1f4667012..8f4df849801 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
>  config LINKER_LIST_ALIGN
>         int
>         default 32 if SANDBOX
> -       default 8 if ARM64 || X86
> +       default 8 if ARM64 || X86 || CPU_MIPS64
>         default 4
>         help
>           Force the each linker list to be aligned to this boundary. This
> --
> 2.40.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP
  2024-10-03 15:22 ` [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP Jerome Forissier
@ 2024-10-04  7:13   ` Ilias Apalodimas
  2024-10-09  1:55   ` Simon Glass
  1 sibling, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  7:13 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Simon Glass, Yang Xiwen, Kever Yang, Philip Oberfichtner,
	Boon Khai Ng, Robert Marko, Jonas Karlman, Neil Armstrong,
	Patrice Chotard, Marek Vasut

On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Introduce ETH_SANDBOX_LWIP which enables a mock driver similar to
> ETH_SANDOX but without the dependencies on the legacy network stack
> (NET) so that it may be enabled when the lwIP stack (NET_LWIP) is
> introduced. The driver does nothing at this stage but its presence
> will allow dm_test_iommu_noiommu [1] to pass.
>
> [1] ./u-boot -T -c "ut dm dm_test_iommu_noiommu"
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  drivers/net/Kconfig        | 11 +++++
>  drivers/net/Makefile       |  1 +
>  drivers/net/sandbox-lwip.c | 85 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 97 insertions(+)
>  create mode 100644 drivers/net/sandbox-lwip.c
>
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index e7d0ddfe25a..2f39ec05ac7 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -350,6 +350,17 @@ config ETH_SANDBOX
>
>           This driver is particularly useful in the test/dm/eth.c tests
>
> +config ETH_SANDBOX_LWIP
> +       depends on SANDBOX
> +       depends on NET_LWIP
> +       default y
> +       bool "Sandbox: Mocked Ethernet driver (for NET_LWIP)"
> +       help
> +         This driver is meant as a replacement for ETH_SANDBOX when
> +         the network stack is NET_LWIP rather than NET. It currently
> +         does nothing, i.e. it drops the sent packets and never receives
> +         data.
> +
>  config ETH_SANDBOX_RAW
>         depends on SANDBOX
>         default y
> diff --git a/drivers/net/Makefile b/drivers/net/Makefile
> index 4946a63f80f..f5ab1f5dedf 100644
> --- a/drivers/net/Makefile
> +++ b/drivers/net/Makefile
> @@ -39,6 +39,7 @@ obj-$(CONFIG_ETH_DESIGNWARE_SOCFPGA) += dwmac_socfpga.o
>  obj-$(CONFIG_ETH_SANDBOX) += sandbox.o
>  obj-$(CONFIG_ETH_SANDBOX_RAW) += sandbox-raw-bus.o
>  obj-$(CONFIG_ETH_SANDBOX_RAW) += sandbox-raw.o
> +obj-$(CONFIG_ETH_SANDBOX_LWIP) += sandbox-lwip.o
>  obj-$(CONFIG_FEC_MXC) += fec_mxc.o
>  obj-$(CONFIG_FMAN_ENET) += fm/
>  obj-$(CONFIG_FMAN_ENET) += fsl_mdio.o
> diff --git a/drivers/net/sandbox-lwip.c b/drivers/net/sandbox-lwip.c
> new file mode 100644
> index 00000000000..3721033c310
> --- /dev/null
> +++ b/drivers/net/sandbox-lwip.c
> @@ -0,0 +1,85 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2015 National Instruments
> + *
> + * (C) Copyright 2015
> + * Joe Hershberger <joe.hershberger@ni.com>
> + */
> +
> +#include <dm.h>
> +#include <log.h>
> +#include <malloc.h>
> +#include <net.h>
> +#include <asm/eth.h>
> +#include <asm/global_data.h>
> +#include <asm/test.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static int sb_lwip_eth_start(struct udevice *dev)
> +{
> +       debug("eth_sandbox_lwip: Start\n");
> +
> +       return 0;
> +}
> +
> +static int sb_lwip_eth_send(struct udevice *dev, void *packet, int length)
> +{
> +       debug("eth_sandbox_lwip: Send packet %d\n", length);
> +
> +       return -ENOTSUPP;
> +}
> +
> +static int sb_lwip_eth_recv(struct udevice *dev, int flags, uchar **packetp)
> +{
> +       return -EAGAIN;
> +}
> +
> +static int sb_lwip_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
> +{
> +       return 0;
> +}
> +
> +static void sb_lwip_eth_stop(struct udevice *dev)
> +{
> +}
> +
> +static int sb_lwip_eth_write_hwaddr(struct udevice *dev)
> +{
> +       return 0;
> +}
> +
> +static const struct eth_ops sb_eth_ops = {
> +       .start                  = sb_lwip_eth_start,
> +       .send                   = sb_lwip_eth_send,
> +       .recv                   = sb_lwip_eth_recv,
> +       .free_pkt               = sb_lwip_eth_free_pkt,
> +       .stop                   = sb_lwip_eth_stop,
> +       .write_hwaddr           = sb_lwip_eth_write_hwaddr,
> +};
> +
> +static int sb_lwip_eth_remove(struct udevice *dev)
> +{
> +       return 0;
> +}
> +
> +static int sb_lwip_eth_of_to_plat(struct udevice *dev)
> +{
> +       return 0;
> +}
> +
> +static const struct udevice_id sb_eth_ids[] = {
> +       { .compatible = "sandbox,eth" },
> +       { }
> +};
> +
> +U_BOOT_DRIVER(eth_sandbox) = {
> +       .name   = "eth_lwip_sandbox",
> +       .id     = UCLASS_ETH,
> +       .of_match = sb_eth_ids,
> +       .of_to_plat = sb_lwip_eth_of_to_plat,
> +       .remove = sb_lwip_eth_remove,
> +       .ops    = &sb_eth_ops,
> +       .priv_auto      = 0,
> +       .plat_auto      = sizeof(struct eth_pdata),
> +};
> --
> 2.40.1
>

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c
  2024-10-04  6:52   ` Ilias Apalodimas
@ 2024-10-04  8:01     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04  8:01 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Simon Glass, Sean Anderson, Marek Vasut



On 10/4/24 08:52, Ilias Apalodimas wrote:
> On Thu, 3 Oct 2024 at 18:24, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> copy_filename() can be useful when NET_LWIP is enabled, therefore
>> move it out of net/net.c which is built only when networking choice
>> is NET.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  net/Makefile     |  2 ++
>>  net/net-common.c | 13 +++++++++++++
>>  net/net.c        | 12 ------------
>>  3 files changed, 15 insertions(+), 12 deletions(-)
>>  create mode 100644 net/net-common.c
>>
>> diff --git a/net/Makefile b/net/Makefile
>> index 70eec8caf0d..a9cecee637a 100644
>> --- a/net/Makefile
>> +++ b/net/Makefile
>> @@ -42,3 +42,5 @@ obj-$(CONFIG_CMD_WGET) += wget.o
>>  CFLAGS_eth_common.o += -Wno-format-extra-args
>>
>>  endif
>> +
>> +obj-y += net-common.o
> 
> This seems to belong in the net-common split patch?

The patch you're referring to only splits the headers. But yeah
it would probably make more sense to do this as well. I will combine
the two patches in v12.

>> diff --git a/net/net-common.c b/net/net-common.c
>> new file mode 100644
>> index 00000000000..a7f767d5e9c
>> --- /dev/null
>> +++ b/net/net-common.c
>> @@ -0,0 +1,13 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +
>> +void copy_filename(char *dst, const char *src, int size)
>> +{
>> +       if (src && *src && (*src == '"')) {
>> +               ++src;
>> +               --size;
>> +       }
>> +
>> +       while ((--size > 0) && src && *src && (*src != '"'))
>> +               *dst++ = *src++;
>> +       *dst = '\0';
>> +}
>> diff --git a/net/net.c b/net/net.c
>> index 1e0b7c85624..c1d10a77b9e 100644
>> --- a/net/net.c
>> +++ b/net/net.c
>> @@ -1689,18 +1689,6 @@ void net_set_udp_header(uchar *pkt, struct in_addr dest, int dport, int sport,
>>         ip->udp_xsum = 0;
>>  }
>>
>> -void copy_filename(char *dst, const char *src, int size)
>> -{
>> -       if (src && *src && (*src == '"')) {
>> -               ++src;
>> -               --size;
>> -       }
>> -
>> -       while ((--size > 0) && src && *src && (*src != '"'))
>> -               *dst++ = *src++;
>> -       *dst = '\0';
>> -}
>> -
>>  int is_serverip_in_cmd(void)
>>  {
>>         return !!strchr(net_boot_file_name, ':');
>> --
>> 2.40.1
>>
> 
> With the the above fixed
> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

Thanks,

-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it.
  2024-10-04  7:11   ` Ilias Apalodimas
@ 2024-10-04  8:36     ` Jerome Forissier
  2024-10-05  3:26       ` Jon Humphreys
  0 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04  8:36 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Jonathan Humphreys, Joe Hershberger, Ramon Fried,
	Tom Rini



On 10/4/24 09:11, Ilias Apalodimas wrote:
> On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> From: Jonathan Humphreys <j-humphreys@ti.com>
> 
> A short description is missing here

I will fold this patch into the previous one since it was a review
comment from Jonathan H. ; Jonathan I hope you don't mind?

Thanks,
-- 
Jerome

> 
> Thanks
> /Ilias
>>
>> Signed-off-by: Jonathan Humphreys <j-humphreys@ti.com>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  net/lwip/wget.c | 6 ------
>>  1 file changed, 6 deletions(-)
>>
>> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
>> index e8768fc2acd..b495ebd1aa9 100644
>> --- a/net/lwip/wget.c
>> +++ b/net/lwip/wget.c
>> @@ -349,12 +349,6 @@ bool wget_validate_uri(char *uri)
>>                 ret = false;
>>                 goto out;
>>         }
>> -       s = strchr(authority, ':');
>> -       if (s) {
>> -               log_err("user defined port is not supported\n");
>> -               ret = false;
>> -               goto out;
>> -       }
>>
>>  out:
>>         free(str_copy);
>> --
>> 2.40.1
>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand
  2024-10-04  6:50   ` Ilias Apalodimas
@ 2024-10-04  8:43     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04  8:43 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Manoj Sai, Matteo Lisi, Tom Rini, Gilles Talis,
	Michal Simek, Marek Vasut, Joe Hershberger, Ramon Fried, Peng Fan,
	Nishanth Menon, Simon Glass, Sughosh Ganu, Padmarao Begari,
	Venkatesh Yadav Abbarapu, James Hilliard, Petr Zejdl,
	Mattijs Korpershoek, Heinrich Schuchardt, AKASHI Takahiro,
	Francis Laniel, Maxim Moskalets, Sean Anderson, Rasmus Villemoes,
	Artur Rojek, Janne Grunau, Neal Gompa, Yang Xiwen, Boon Khai Ng,
	Robert Marko, Philip Oberfichtner, Jonas Karlman, Masahisa Kojima



On 10/4/24 08:50, Ilias Apalodimas wrote:
> Hi Jerome,
> 
> [...]
> 
> 
>> +#define DHCP_TIMEOUT_MS 10000
>> +
>> +#ifdef CONFIG_CMD_TFTPBOOT
>> +/* Boot file obtained from DHCP (if present) */
>> +static char boot_file_name[DHCP_BOOT_FILE_LEN];
>> +#endif
>> +
>> +static void call_lwip_dhcp_fine_tmr(void *ctx)
>> +{
>> +       dhcp_fine_tmr();
>> +       sys_timeout(10, call_lwip_dhcp_fine_tmr, NULL);
>> +}
>> +
>> +static int dhcp_loop(struct udevice *udev)
>> +{
>> +       char *ipstr = "ipaddr\0\0";
>> +       char *maskstr = "netmask\0\0";
>> +       char *gwstr = "gatewayip\0\0";
>> +       unsigned long start;
>> +       struct netif *netif;
>> +       struct dhcp *dhcp;
>> +       bool bound;
>> +       int idx;
>> +
>> +       idx = dev_seq(udev);
>> +       if (idx < 0 || idx > 99) {
>> +               log_err("unexpected idx %d\n", idx);
>> +               return CMD_RET_FAILURE;
>> +       }
>> +
>> +       netif = net_lwip_new_netif_noip(udev);
>> +       if (!netif)
>> +               return CMD_RET_FAILURE;
>> +
>> +       start = get_timer(0);
>> +       dhcp_start(netif);
> 
> This can fail. Don't we have to check that and exit?

Yes, will fix.

>> +       call_lwip_dhcp_fine_tmr(NULL);
>> +
>> +       /* Wait for DHCP to complete */
>> +       do {
>> +               net_lwip_rx(udev, netif);
>> +               sys_check_timeouts();
>> +               bound = dhcp_supplied_address(netif);
>> +               if (bound)
>> +                       break;
>> +               if (ctrlc()) {
>> +                       printf("Abort\n");
>> +                       break;
>> +               }
>> +               mdelay(1);
>> +       } while (get_timer(start) < DHCP_TIMEOUT_MS);
>> +
>> +       sys_untimeout(call_lwip_dhcp_fine_tmr, NULL);
>> +
> 
> [...]
> 
>> +       free(pp);
>> +       if (err) {
>> +               log_err("send error %d\n", err);
>> +               return ERR_ABRT;
>> +       }
>> +
>> +       return ERR_OK;
>> +}
>> +
>> +static err_t net_lwip_if_init(struct netif *netif)
>> +{
>> +#if LWIP_IPV4
> 
> Do we ever not set this?

No. Removed in v12.

 
>> +       netif->output = etharp_output;
>> +#endif
>> +       netif->linkoutput = linkoutput;
>> +       netif->mtu = 1500;
>> +       netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
>> +
>> +       return ERR_OK;
>> +}
>> +
>> +static void eth_init_rings(void)
>> +{
>> +       int i;
>> +
>> +       for (i = 0; i < PKTBUFSRX; i++)
>> +               net_rx_packets[i] = net_pkt_buf + i  * PKTSIZE_ALIGN;
>> +}
>> +
>> +struct netif *net_lwip_get_netif(void)
>> +{
>> +       struct netif *netif, *found = NULL;
>> +
>> +       NETIF_FOREACH(netif) {
>> +               if (!found)
>> +                       found = netif;
>> +               else
>> +                       printf("Error: more than one netif in lwIP\n");
>> +       }
>> +       return found;
>> +}
>> +
>> +static int get_udev_ipv4_info(struct udevice *dev, ip4_addr_t *ip,
>> +                             ip4_addr_t *mask, ip4_addr_t *gw)
>> +{
>> +       char *ipstr = "ipaddr\0\0";
>> +       char *maskstr = "netmask\0\0";
>> +       char *gwstr = "gatewayip\0\0";
>> +       int idx = dev_seq(dev);
>> +       char *env;
>> +
>> +       if (idx < 0 || idx > 99) {
>> +               log_err("unexpected idx %d\n", idx);
>> +               return -1;
>> +       }
>> +
> 
> [...]
> 
> FWIW dhcp seems to work fine
> 
> Tested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
> 
> Thanks
> /Ilias

Thanks,
-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-04  6:55   ` Ilias Apalodimas
@ 2024-10-04  8:46     ` Jerome Forissier
  2024-10-04  9:37       ` Ilias Apalodimas
  0 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04  8:46 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Simon Glass, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel



On 10/4/24 08:55, Ilias Apalodimas wrote:
> Hi Jerome,
> 
> On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
>>
>>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
>>  [...]
>>  Scanning for bootflows with label '9'
>>  [...]
>>  Cannot find '9' (err=-19)
>>
>> This is due to the device list containing two less entries than
>> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
>>
>> The actual use case is NET_LWIP=y (to be introduced in later patches)
>> which implies DSA_SANDBOX=n for the time being.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  test/boot/bootflow.c | 7 +++++--
>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
>> index 6ad63afe90a..c440b8eb778 100644
>> --- a/test/boot/bootflow.c
>> +++ b/test/boot/bootflow.c
>> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
>>          * 8   [   ]      OK  mmc       mmc2.bootdev
>>          * 9   [ + ]      OK  mmc       mmc1.bootdev
>>          * a   [   ]      OK  mmc       mmc0.bootdev
>> +        *
>> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
>> +        * dsa-test@1).
>>          */
>> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
>> -       ut_assert_nextline("Scanning for bootflows with label '9'");
> 
> Shouldn't this under and #ifdef, IS_ENABLED etc?

In theory yes, but we can avoid the conditional by using index 7 which is always
valid, i.e., in all configurations we have at least 7 devices (even 8 actually).

> 
>> +       ut_assertok(run_command("bootflow scan -lH 7", 0));
>> +       ut_assert_nextline("Scanning for bootflows with label '7'");
>>         ut_assert_skip_to_line("(1 bootflow, 1 valid)");
>>
>>         ut_assertok(run_command("bootflow scan -lH 0", 0));
>> --
>> 2.40.1
>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode
  2024-10-04  6:11   ` Ilias Apalodimas
@ 2024-10-04  9:07     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04  9:07 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini



On 10/4/24 08:11, Ilias Apalodimas wrote:
> Hi Jerome,
> 
> On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> The TFTP app should not bind to the TFTP server port when configured as
>> a client. Instead, the local port should be chosen from the dynamic
>> range (49152 ~ 65535) so that if the application is stopped and started
>> again, the remote server will not consider the new packets as part of
>> the same context (which would cause an error since a new RRQ would be
>> unexpected).
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  lib/lwip/lwip/src/apps/tftp/tftp.c | 10 ++++++----
>>  1 file changed, 6 insertions(+), 4 deletions(-)
>>
>> diff --git a/lib/lwip/lwip/src/apps/tftp/tftp.c b/lib/lwip/lwip/src/apps/tftp/tftp.c
>> index ddfdbfc0c1b..74fc1fbe586 100644
>> --- a/lib/lwip/lwip/src/apps/tftp/tftp.c
>> +++ b/lib/lwip/lwip/src/apps/tftp/tftp.c
>> @@ -454,10 +454,12 @@ tftp_init_common(u8_t mode, const struct tftp_context *ctx)
>>      return ERR_MEM;
>>    }
>>
>> -  ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
>> -  if (ret != ERR_OK) {
>> -    udp_remove(pcb);
>> -    return ret;
>> +  if (mode == LWIP_TFTP_MODE_SERVER) {
>> +    ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);
>> +    if (ret != ERR_OK) {
>> +      udp_remove(pcb);
>> +      return ret;
>> +    }
> 
> This should be sent to lwip as well right?

Yes: https://savannah.nongnu.org/patch/?10480

Link added to the patch description.

> 
>>    }
>>
>>    tftp_state.handle    = NULL;
>> --
>> 2.40.1
>>
> 
> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

Thanks,
-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-04  8:46     ` Jerome Forissier
@ 2024-10-04  9:37       ` Ilias Apalodimas
  2024-10-04 12:01         ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04  9:37 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Simon Glass, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel

On Fri, 4 Oct 2024 at 11:46, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
>
>
> On 10/4/24 08:55, Ilias Apalodimas wrote:
> > Hi Jerome,
> >
> > On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
> > <jerome.forissier@linaro.org> wrote:
> >>
> >> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
> >>
> >>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
> >>  [...]
> >>  Scanning for bootflows with label '9'
> >>  [...]
> >>  Cannot find '9' (err=-19)
> >>
> >> This is due to the device list containing two less entries than
> >> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
> >>
> >> The actual use case is NET_LWIP=y (to be introduced in later patches)
> >> which implies DSA_SANDBOX=n for the time being.
> >>
> >> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> >> ---
> >>  test/boot/bootflow.c | 7 +++++--
> >>  1 file changed, 5 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> >> index 6ad63afe90a..c440b8eb778 100644
> >> --- a/test/boot/bootflow.c
> >> +++ b/test/boot/bootflow.c
> >> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
> >>          * 8   [   ]      OK  mmc       mmc2.bootdev
> >>          * 9   [ + ]      OK  mmc       mmc1.bootdev
> >>          * a   [   ]      OK  mmc       mmc0.bootdev
> >> +        *
> >> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
> >> +        * dsa-test@1).
> >>          */
> >> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
> >> -       ut_assert_nextline("Scanning for bootflows with label '9'");
> >
> > Shouldn't this under and #ifdef, IS_ENABLED etc?
>
> In theory yes, but we can avoid the conditional by using index 7 which is always
> valid, i.e., in all configurations we have at least 7 devices (even 8 actually).

Ok, but I *think* Simon was trying to match the exact out put here,
not 'at least 7'.

I think we are better off being strict on this test

Thanks
/Ilias
>
> >
> >> +       ut_assertok(run_command("bootflow scan -lH 7", 0));
> >> +       ut_assert_nextline("Scanning for bootflows with label '7'");
> >>         ut_assert_skip_to_line("(1 bootflow, 1 valid)");
> >>
> >>         ut_assertok(run_command("bootflow scan -lH 0", 0));
> >> --
> >> 2.40.1
> >>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-04  9:37       ` Ilias Apalodimas
@ 2024-10-04 12:01         ` Jerome Forissier
  2024-10-07 15:23           ` Simon Glass
  0 siblings, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04 12:01 UTC (permalink / raw)
  To: Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Simon Glass, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel



On 10/4/24 11:37, Ilias Apalodimas wrote:
> On Fri, 4 Oct 2024 at 11:46, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>>
>>
>> On 10/4/24 08:55, Ilias Apalodimas wrote:
>>> Hi Jerome,
>>>
>>> On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
>>> <jerome.forissier@linaro.org> wrote:
>>>>
>>>> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
>>>>
>>>>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
>>>>  [...]
>>>>  Scanning for bootflows with label '9'
>>>>  [...]
>>>>  Cannot find '9' (err=-19)
>>>>
>>>> This is due to the device list containing two less entries than
>>>> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
>>>>
>>>> The actual use case is NET_LWIP=y (to be introduced in later patches)
>>>> which implies DSA_SANDBOX=n for the time being.
>>>>
>>>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>>>> ---
>>>>  test/boot/bootflow.c | 7 +++++--
>>>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
>>>> index 6ad63afe90a..c440b8eb778 100644
>>>> --- a/test/boot/bootflow.c
>>>> +++ b/test/boot/bootflow.c
>>>> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
>>>>          * 8   [   ]      OK  mmc       mmc2.bootdev
>>>>          * 9   [ + ]      OK  mmc       mmc1.bootdev
>>>>          * a   [   ]      OK  mmc       mmc0.bootdev
>>>> +        *
>>>> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
>>>> +        * dsa-test@1).
>>>>          */
>>>> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
>>>> -       ut_assert_nextline("Scanning for bootflows with label '9'");
>>>
>>> Shouldn't this under and #ifdef, IS_ENABLED etc?
>>
>> In theory yes, but we can avoid the conditional by using index 7 which is always
>> valid, i.e., in all configurations we have at least 7 devices (even 8 actually).
> 
> Ok, but I *think* Simon was trying to match the exact out put here,
> not 'at least 7'.
> 
> I think we are better off being strict on this test

No because there are 10 entries according to the comment ("a" hex being
mmc0.bootdev). Simon, what do you suggest?

Thanks,
-- 
Jerome

> 
> Thanks
> /Ilias
>>
>>>
>>>> +       ut_assertok(run_command("bootflow scan -lH 7", 0));
>>>> +       ut_assert_nextline("Scanning for bootflows with label '7'");
>>>>         ut_assert_skip_to_line("(1 bootflow, 1 valid)");
>>>>
>>>>         ut_assertok(run_command("bootflow scan -lH 0", 0));
>>>> --
>>>> 2.40.1
>>>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command
  2024-10-03 15:46 ` [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command Jerome Forissier
@ 2024-10-04 12:02   ` Ilias Apalodimas
  0 siblings, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04 12:02 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Simon Glass, Mattijs Korpershoek, AKASHI Takahiro,
	Heinrich Schuchardt, Masahisa Kojima, Marek Vasut, Sean Anderson

On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Implement do_tftpb(). This implementation of the tftp command
> supports an optional port number. For example:
>
>  tftp 192.168.0.30:9069:file.bin
>
> It also supports taking the server IP from ${tftpserverip} if
> defined, before falling back to ${serverip}.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  cmd/Kconfig          |   3 +-
>  cmd/net-lwip.c       |   8 ++
>  include/net-common.h |   4 +
>  include/net-lwip.h   |   4 +
>  lib/binman.c         |   1 +
>  net/lwip/dhcp.c      |  11 +-
>  net/lwip/net-lwip.c  |  16 +++
>  net/lwip/tftp.c      | 283 ++++++++++++++++++++++++++++++++++++++++++-
>  8 files changed, 324 insertions(+), 6 deletions(-)
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index d09c237a52f..f1372a025b7 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -2119,10 +2119,9 @@ config CMD_MDIO
>  config CMD_TFTPBOOT
>         bool "tftp"
>         select PROT_UDP_LWIP if NET_LWIP
> -       default n
> +       default y
>         help
>           tftpboot - load file via network using TFTP protocol
> -         Currently a placeholder (not implemented) when NET_LWIP=y.
>
>  endif  # if CMD_NET
>
> diff --git a/cmd/net-lwip.c b/cmd/net-lwip.c
> index 82edb5fd2e6..80f0872bb8f 100644
> --- a/cmd/net-lwip.c
> +++ b/cmd/net-lwip.c
> @@ -11,3 +11,11 @@ U_BOOT_CMD(
>          "[loadAddress] [[hostIPaddr:]bootfilename]"
>  );
>  #endif
> +
> +#if defined(CONFIG_CMD_TFTPBOOT)
> +U_BOOT_CMD(
> +       tftpboot,       3,      0,      do_tftpb,
> +       "boot image via network using TFTP protocol\n",
> +       "[loadAddress] [[hostIPaddr:]bootfilename]"
> +);
> +#endif
> diff --git a/include/net-common.h b/include/net-common.h
> index cbcac178c82..fd7c5e7b488 100644
> --- a/include/net-common.h
> +++ b/include/net-common.h
> @@ -459,6 +459,10 @@ static inline struct in_addr env_get_ip(char *var)
>
>  int net_init(void);
>
> +/* NET compatibility */
> +enum proto_t;
> +int net_loop(enum proto_t protocol);
> +
>  /**
>   * dhcp_run() - Run DHCP on the current ethernet device
>   *
> diff --git a/include/net-lwip.h b/include/net-lwip.h
> index cfd06726577..37744b0e2cd 100644
> --- a/include/net-lwip.h
> +++ b/include/net-lwip.h
> @@ -6,6 +6,10 @@
>  #include <lwip/ip4.h>
>  #include <lwip/netif.h>
>
> +enum proto_t {
> +       TFTPGET
> +};
> +
>  struct netif *net_lwip_new_netif(struct udevice *udev);
>  struct netif *net_lwip_new_netif_noip(struct udevice *udev);
>  void net_lwip_remove_netif(struct netif *netif);
> diff --git a/lib/binman.c b/lib/binman.c
> index 9047f5275f3..93d85548116 100644
> --- a/lib/binman.c
> +++ b/lib/binman.c
> @@ -137,6 +137,7 @@ int binman_init(void)
>  {
>         int ret;
>
> +       return 0;
>         binman = malloc(sizeof(struct binman_info));
>         if (!binman)
>                 return log_msg_ret("space for binman", -ENOMEM);
> diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c
> index be458d554cb..14685cf7825 100644
> --- a/net/lwip/dhcp.c
> +++ b/net/lwip/dhcp.c
> @@ -116,11 +116,20 @@ int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>  int dhcp_run(ulong addr, const char *fname, bool autoload)
>  {
>         char *dhcp_argv[] = {"dhcp", NULL, };
> +#ifdef CONFIG_CMD_TFTPBOOT
> +       char *tftp_argv[] = {"tftpboot", boot_file_name, NULL, };
> +#endif
>         struct cmd_tbl cmdtp = {};      /* dummy */
>
>         if (autoload) {
> -               /* Will be supported when TFTP is added */
> +#ifdef CONFIG_CMD_TFTPBOOT
> +               /* Assume DHCP was already performed */
> +               if (boot_file_name[0])
> +                       return do_tftpb(&cmdtp, 0, 2, tftp_argv);
> +               return 0;
> +#else
>                 return -EOPNOTSUPP;
> +#endif
>         }
>
>         return do_dhcp(&cmdtp, 0, 1, dhcp_argv);
> diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c
> index ca5426d058b..6a27d71de73 100644
> --- a/net/lwip/net-lwip.c
> +++ b/net/lwip/net-lwip.c
> @@ -28,6 +28,7 @@ const u8 net_bcast_ethaddr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
>  char *pxelinux_configfile;
>  /* Our IP addr (0 = unknown) */
>  struct in_addr net_ip;
> +char net_boot_file_name[1024];
>
>  static err_t linkoutput(struct netif *netif, struct pbuf *p)
>  {
> @@ -285,6 +286,21 @@ void net_process_received_packet(uchar *in_packet, int len)
>  #endif
>  }
>
> +int net_loop(enum proto_t protocol)
> +{
> +       char *argv[1];
> +
> +       switch (protocol) {
> +       case TFTPGET:
> +               argv[0] = "tftpboot";
> +               return do_tftpb(NULL, 0, 1, argv);
> +       default:
> +               return -EINVAL;
> +       }
> +
> +       return -EINVAL;
> +}
> +
>  u32_t sys_now(void)
>  {
>         return get_timer(0);
> diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c
> index 1fa246f55d9..26978643313 100644
> --- a/net/lwip/tftp.c
> +++ b/net/lwip/tftp.c
> @@ -2,10 +2,287 @@
>  /* Copyright (C) 2024 Linaro Ltd. */
>
>  #include <command.h>
> -#include <net-lwip.h>
> +#include <console.h>
> +#include <display_options.h>
> +#include <dm/device.h>
> +#include <efi_loader.h>
> +#include <image.h>
> +#include <linux/delay.h>
> +#include <lwip/apps/tftp_client.h>
> +#include <lwip/timeouts.h>
> +#include <mapmem.h>
> +#include <net.h>
> +#include <time.h>
> +
> +#define PROGRESS_PRINT_STEP_BYTES (10 * 1024)
> +
> +enum done_state {
> +       NOT_DONE = 0,
> +       SUCCESS,
> +       FAILURE,
> +       ABORTED
> +};
> +
> +struct tftp_ctx {
> +       ulong daddr;
> +       ulong size;
> +       ulong block_count;
> +       ulong start_time;
> +       enum done_state done;
> +};
> +
> +static void *tftp_open(const char *fname, const char *mode, u8_t is_write)
> +{
> +       return NULL;
> +}
> +
> +static void tftp_close(void *handle)
> +{
> +       struct tftp_ctx *ctx = handle;
> +       ulong elapsed;
> +
> +       if (ctx->done == FAILURE || ctx->done == ABORTED) {
> +               /* Closing after an error or Ctrl-C */
> +               return;
> +       }
> +       ctx->done = SUCCESS;
> +
> +       elapsed = get_timer(ctx->start_time);
> +       if (elapsed > 0) {
> +               puts("\n\t ");  /* Line up with "Loading: " */
> +               print_size(ctx->size / elapsed * 1000, "/s");
> +       }
> +       puts("\ndone\n");
> +       printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
> +
> +       if (env_set_hex("filesize", ctx->size)) {
> +               log_err("filesize not updated\n");
> +               return;
> +       }
> +}
> +
> +static int tftp_read(void *handle, void *buf, int bytes)
> +{
> +       return 0;
> +}
> +
> +static int tftp_write(void *handle, struct pbuf *p)
> +{
> +       struct tftp_ctx *ctx = handle;
> +       struct pbuf *q;
> +
> +       for (q = p; q != NULL; q = q->next) {
> +               memcpy((void *)ctx->daddr, q->payload, q->len);
> +               ctx->daddr += q->len;
> +               ctx->size += q->len;
> +               ctx->block_count++;
> +               if (ctx->block_count % 10 == 0) {
> +                       putc('#');
> +                       if (ctx->block_count % (65 * 10) == 0)
> +                               puts("\n\t ");
> +               }
> +       }
> +
> +       return 0;
> +}
> +
> +static void tftp_error(void *handle, int err, const char *msg, int size)
> +{
> +       struct tftp_ctx *ctx = handle;
> +       char message[100];
> +
> +       ctx->done = FAILURE;
> +       memset(message, 0, sizeof(message));
> +       memcpy(message, msg, LWIP_MIN(sizeof(message) - 1, (size_t)size));
> +
> +       printf("\nTFTP error: %d (%s)\n", err, message);
> +}
> +
> +static const struct tftp_context tftp_context = {
> +       tftp_open,
> +       tftp_close,
> +       tftp_read,
> +       tftp_write,
> +       tftp_error
> +};
> +
> +static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
> +                    ip_addr_t srvip, uint16_t srvport)
> +{
> +       struct netif *netif;
> +       struct tftp_ctx ctx;
> +       err_t err;
> +
> +       if (!fname || addr == 0)
> +               return -1;
> +
> +       if (!srvport)
> +               srvport = TFTP_PORT;
> +
> +       netif = net_lwip_new_netif(udev);
> +       if (!netif)
> +               return -1;
> +
> +       ctx.done = NOT_DONE;
> +       ctx.size = 0;
> +       ctx.block_count = 0;
> +       ctx.daddr = addr;
> +
> +       printf("Using %s device\n", udev->name);
> +       printf("TFTP from server %s; our IP address is %s\n",
> +                ip4addr_ntoa(&srvip), env_get("ipaddr"));
> +       printf("Filename '%s'.\n", fname);
> +       printf("Load address: 0x%lx\n", ctx.daddr);
> +       printf("Loading: ");
> +
> +       err = tftp_init_client(&tftp_context);
> +       if (!(err == ERR_OK || err == ERR_USE))
> +               log_err("tftp_init_client err: %d\n", err);
> +
> +       ctx.start_time = get_timer(0);
> +       err = tftp_get(&ctx, &srvip, srvport, fname, TFTP_MODE_OCTET);
> +       /* might return different errors, like routing problems */
> +       if (err != ERR_OK) {
> +               printf("tftp_get() error %d\n", err);
> +               net_lwip_remove_netif(netif);
> +               return -1;
> +       }
> +
> +       while (!ctx.done) {
> +               net_lwip_rx(udev, netif);
> +               sys_check_timeouts();
> +               if (ctrlc()) {
> +                       printf("\nAbort\n");
> +                       ctx.done = ABORTED;
> +                       break;
> +               }
> +       }
> +
> +       tftp_cleanup();
> +
> +       net_lwip_remove_netif(netif);
> +
> +       if (ctx.done == SUCCESS) {
> +               if (env_set_hex("fileaddr", addr)) {
> +                       log_err("fileaddr not updated\n");
> +                       return -1;
> +               }
> +               efi_set_bootdev("Net", "", fname, map_sysmem(addr, 0),
> +                               ctx.size);
> +               return 0;
> +       }
> +
> +       return -1;
> +}
>
>  int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>  {
> -       /* Not implemented */
> -       return CMD_RET_FAILURE;
> +       int ret = CMD_RET_SUCCESS;
> +       char *arg = NULL;
> +       char *words[3] = { };
> +       char *fname = NULL;
> +       char *server_ip = NULL;
> +       char *server_port = NULL;
> +       char *end;
> +       ip_addr_t srvip;
> +       uint16_t port = TFTP_PORT;
> +       ulong laddr;
> +       ulong addr;
> +       int i;
> +
> +       laddr = env_get_ulong("loadaddr", 16, image_load_addr);
> +
> +       switch (argc) {
> +       case 1:
> +               fname = env_get("bootfile");
> +               break;
> +       case 2:
> +               /*
> +                * Only one arg - accept two forms:
> +                * Just load address, or just boot file name. The latter
> +                * form must be written in a format which can not be
> +                * mis-interpreted as a valid number.
> +                */
> +               addr = hextoul(argv[1], &end);
> +               if (end == (argv[1] + strlen(argv[1]))) {
> +                       laddr = addr;
> +                       fname = env_get("bootfile");
> +               } else {
> +                       arg = strdup(argv[1]);
> +               }
> +               break;
> +       case 3:
> +               laddr = hextoul(argv[1], NULL);
> +               arg = strdup(argv[2]);
> +               break;
> +       default:
> +               ret = CMD_RET_USAGE;
> +               goto out;
> +       }
> +
> +       if (!arg)
> +               arg = net_boot_file_name;
> +
> +       if (arg) {
> +               /* Parse [ip:[port:]]fname */
> +               i = 0;
> +               while ((*(words + i) = strsep(&arg,":")))
> +                       i++;
> +
> +               switch (i) {
> +               case 3:
> +                       server_ip = words[0];
> +                       server_port = words[1];
> +                       fname = words[2];
> +                       break;
> +               case 2:
> +                       server_ip = words[0];
> +                       fname = words[1];
> +                       break;
> +               case 1:
> +                       fname = words[0];
> +                       break;
> +               default:
> +                       break;
> +               }
> +       }
> +
> +       if (!server_ip)
> +               server_ip = env_get("tftpserverip");
> +       if (!server_ip)
> +               server_ip = env_get("serverip");
> +       if (!server_ip) {
> +               log_err("error: tftpserverip/serverip has to be set\n");
> +               ret = CMD_RET_FAILURE;
> +               goto out;
> +       }
> +
> +       if (server_port)
> +               port = dectoul(server_port, NULL);
> +
> +       if (!ipaddr_aton(server_ip, &srvip)) {
> +               log_err("error: ipaddr_aton\n");
> +               ret = CMD_RET_FAILURE;
> +               goto out;
> +       }
> +
> +       if (!fname) {
> +               log_err("error: no file name\n");
> +               ret = CMD_RET_FAILURE;
> +               goto out;
> +       }
> +
> +       if (!laddr) {
> +               log_err("error: no load address\n");
> +               ret = CMD_RET_FAILURE;
> +               goto out;
> +       }
> +
> +       eth_set_current();
> +
> +       if (tftp_loop(eth_get_dev(), laddr, fname, srvip, port) < 0)
> +               ret = CMD_RET_FAILURE;
> +out:
> +       free(arg);
> +       return ret;
>  }
> --
> 2.40.1
>

Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Tested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-03 15:22 ` [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64 Jerome Forissier
  2024-10-04  7:12   ` Ilias Apalodimas
@ 2024-10-04 12:04   ` Heinrich Schuchardt
  2024-10-04 12:55     ` Jerome Forissier
  2024-10-07 15:23     ` Simon Glass
  1 sibling, 2 replies; 76+ messages in thread
From: Heinrich Schuchardt @ 2024-10-04 12:04 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Simon Glass, Jiaxun Yang,
	Dan Carpenter, Alexander Gendin, u-boot

On 03.10.24 17:22, Jerome Forissier wrote:
> Note: Patch posted separately [0].
>
> [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>
> CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
> exception may occur. Fixes an issue found on malta64 with QEMU:
>
>   Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
>   31                      if (!strcmp(name, entry->name))
>   [...]
>   ld      a1,0(s0)
>
>   (gdb) p/x &entry->name
>   0xffffffffbe04b0d4
>   (gdb) p/x $s0
>   0xffffffffbe04b0d4
>
>   $ grep __u_boot_list /tmp/malta64/u-boot.objdump
>   4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>   arch/Kconfig | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 8f1f4667012..8f4df849801 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
>   config LINKER_LIST_ALIGN
>   	int
>   	default 32 if SANDBOX
> -	default 8 if ARM64 || X86
> +	default 8 if ARM64 || X86 || CPU_MIPS64

Shouldn't we set 8 byte alignment on all 64bit architectures including
riscv64?

     default 8 if 64BIT

@Simon
I would not know why 32bit X86 should need 8 byte alignment.
I am a bit astonished that you chose 32 byte alignment for the Sandbox.
Is there any justification to use more than 4 on the 32bit Sandbox and
more than 8 on the 64bit Sandbox? If yes, we should document it via a
comment.

Best regards

Heinrich

>   	default 4
>   	help
>   	  Force the each linker list to be aligned to this boundary. This


^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-04 12:04   ` Heinrich Schuchardt
@ 2024-10-04 12:55     ` Jerome Forissier
  2024-10-04 18:28       ` Tom Rini
  2024-10-07 15:23     ` Simon Glass
  1 sibling, 1 reply; 76+ messages in thread
From: Jerome Forissier @ 2024-10-04 12:55 UTC (permalink / raw)
  To: Heinrich Schuchardt
  Cc: Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Simon Glass, Jiaxun Yang,
	Dan Carpenter, Alexander Gendin, u-boot



On 10/4/24 14:04, Heinrich Schuchardt wrote:
> On 03.10.24 17:22, Jerome Forissier wrote:
>> Note: Patch posted separately [0].
>>
>> [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>>
>> CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
>> exception may occur. Fixes an issue found on malta64 with QEMU:
>>
>>   Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
>>   31                      if (!strcmp(name, entry->name))
>>   [...]
>>   ld      a1,0(s0)
>>
>>   (gdb) p/x &entry->name
>>   0xffffffffbe04b0d4
>>   (gdb) p/x $s0
>>   0xffffffffbe04b0d4
>>
>>   $ grep __u_boot_list /tmp/malta64/u-boot.objdump
>>   4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>   arch/Kconfig | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/arch/Kconfig b/arch/Kconfig
>> index 8f1f4667012..8f4df849801 100644
>> --- a/arch/Kconfig
>> +++ b/arch/Kconfig
>> @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
>>   config LINKER_LIST_ALIGN
>>       int
>>       default 32 if SANDBOX
>> -    default 8 if ARM64 || X86
>> +    default 8 if ARM64 || X86 || CPU_MIPS64
> 
> Shouldn't we set 8 byte alignment on all 64bit architectures including
> riscv64?
> 
>     default 8 if 64BIT

Makes sense.

> 
> @Simon
> I would not know why 32bit X86 should need 8 byte alignment.
> I am a bit astonished that you chose 32 byte alignment for the Sandbox.
> Is there any justification to use more than 4 on the 32bit Sandbox and
> more than 8 on the 64bit Sandbox? If yes, we should document it via a
> comment.

I tried running what CI does manually (.azure_pipelines.yml) with
"default 32 if SANDBOX" removed, and I got SIGSEGV with
TEST_PY_BD=sandbox. OTOH, TEST_PY_BD=sandbox64 worked fine but it might
have been a fluke.

Thanks,
-- 
Jerome

> 
> Best regards
> 
> Heinrich
> 
>>       default 4
>>       help
>>         Force the each linker list to be aligned to this boundary. This
> 

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix
  2024-10-03 15:46 ` [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
  2024-10-04  6:05   ` Ilias Apalodimas
@ 2024-10-04 18:25   ` Tom Rini
  2024-10-07  9:00     ` Jerome Forissier
  1 sibling, 1 reply; 76+ messages in thread
From: Tom Rini @ 2024-10-04 18:25 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Simon Glass, Jiaxun Yang,
	Heinrich Schuchardt

[-- Attachment #1: Type: text/plain, Size: 699 bytes --]

On Thu, Oct 03, 2024 at 05:46:29PM +0200, Jerome Forissier wrote:
> Build and run qemu_arm64_lwip_defconfig in CI. This tests the lightweight
> IP (lwIP) implementation of the dhcp, tftpboot and ping commands.
> 
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  .azure-pipelines.yml | 7 +++++++
>  1 file changed, 7 insertions(+)

This should be in .gitlab-ci.yml too. Generally it's close enough to get
without testing (and using the linter if needed), but I'm sure Ilias can
push something through the tpm tree for testing if you want, and we
should get you added to source.denx.de (please go sign up) and access to
the -net tree, really, anyhow.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-04 12:55     ` Jerome Forissier
@ 2024-10-04 18:28       ` Tom Rini
  2024-10-10 13:29         ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Tom Rini @ 2024-10-04 18:28 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: Heinrich Schuchardt, Ilias Apalodimas, Javier Tia, Raymond Mao,
	Maxim Uvarov, Tim Harvey, Anton Antonov, Simon Glass, Jiaxun Yang,
	Dan Carpenter, Alexander Gendin, u-boot

[-- Attachment #1: Type: text/plain, Size: 2408 bytes --]

On Fri, Oct 04, 2024 at 02:55:58PM +0200, Jerome Forissier wrote:
> 
> 
> On 10/4/24 14:04, Heinrich Schuchardt wrote:
> > On 03.10.24 17:22, Jerome Forissier wrote:
> >> Note: Patch posted separately [0].
> >>
> >> [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
> >>
> >> CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
> >> exception may occur. Fixes an issue found on malta64 with QEMU:
> >>
> >>   Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
> >>   31                      if (!strcmp(name, entry->name))
> >>   [...]
> >>   ld      a1,0(s0)
> >>
> >>   (gdb) p/x &entry->name
> >>   0xffffffffbe04b0d4
> >>   (gdb) p/x $s0
> >>   0xffffffffbe04b0d4
> >>
> >>   $ grep __u_boot_list /tmp/malta64/u-boot.objdump
> >>   4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
> >>
> >> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> >> ---
> >>   arch/Kconfig | 2 +-
> >>   1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/arch/Kconfig b/arch/Kconfig
> >> index 8f1f4667012..8f4df849801 100644
> >> --- a/arch/Kconfig
> >> +++ b/arch/Kconfig
> >> @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
> >>   config LINKER_LIST_ALIGN
> >>       int
> >>       default 32 if SANDBOX
> >> -    default 8 if ARM64 || X86
> >> +    default 8 if ARM64 || X86 || CPU_MIPS64
> > 
> > Shouldn't we set 8 byte alignment on all 64bit architectures including
> > riscv64?
> > 
> >     default 8 if 64BIT
> 
> Makes sense.
> 
> > 
> > @Simon
> > I would not know why 32bit X86 should need 8 byte alignment.
> > I am a bit astonished that you chose 32 byte alignment for the Sandbox.
> > Is there any justification to use more than 4 on the 32bit Sandbox and
> > more than 8 on the 64bit Sandbox? If yes, we should document it via a
> > comment.
> 
> I tried running what CI does manually (.azure_pipelines.yml) with
> "default 32 if SANDBOX" removed, and I got SIGSEGV with
> TEST_PY_BD=sandbox. OTOH, TEST_PY_BD=sandbox64 worked fine but it might
> have been a fluke.

I think we can leave sandbox as a future cleanup, and perhaps file an
issue at https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/ so
it doesn't get lost.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (29 preceding siblings ...)
  2024-10-03 16:00 ` [PATCH v11 00/29] Introduce the lwIP network stack Ilias Apalodimas
@ 2024-10-04 18:30 ` Tom Rini
  2024-10-04 18:36   ` Ilias Apalodimas
  2024-10-07 13:31   ` Jerome Forissier
  2024-10-04 19:15 ` Tom Rini
  31 siblings, 2 replies; 76+ messages in thread
From: Tom Rini @ 2024-10-04 18:30 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov

[-- Attachment #1: Type: text/plain, Size: 1704 bytes --]

On Thu, Oct 03, 2024 at 05:22:46PM +0200, Jerome Forissier 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. and
> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE 

So, assuming the outstanding questions raised on v11 are easy enough to
resolve, I think v12 should be posted with being merged in mind (and so
no TESTING patches, etc, since I'll "b4 shazam -SM" it. Thanks for
working on this so hard!

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-04 18:30 ` Tom Rini
@ 2024-10-04 18:36   ` Ilias Apalodimas
  2024-10-07 13:31   ` Jerome Forissier
  1 sibling, 0 replies; 76+ messages in thread
From: Ilias Apalodimas @ 2024-10-04 18:36 UTC (permalink / raw)
  To: Tom Rini
  Cc: Jerome Forissier, u-boot, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov

Tom

On Fri, 4 Oct 2024 at 21:30, Tom Rini <trini@konsulko.com> wrote:
>
> On Thu, Oct 03, 2024 at 05:22:46PM +0200, Jerome Forissier 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. and
> > Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE
>
> So, assuming the outstanding questions raised on v11 are easy enough to
> resolve, I think v12 should be posted with being merged in mind (and so
> no TESTING patches, etc, since I'll "b4 shazam -SM" it. Thanks for
> working on this so hard!

FWIW I am generally happy with the whole series. Unfortunately I dont
have time to do a full detailed review, but we've fixed enough to be
confident it's 'ok' to pull.
I think we'll improve it faster over time once people start using it

Thanks
/Ilias
>
> --
> Tom

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
                   ` (30 preceding siblings ...)
  2024-10-04 18:30 ` Tom Rini
@ 2024-10-04 19:15 ` Tom Rini
  31 siblings, 0 replies; 76+ messages in thread
From: Tom Rini @ 2024-10-04 19:15 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov

[-- Attachment #1: Type: text/plain, Size: 1676 bytes --]

On Thu, Oct 03, 2024 at 05:22:46PM +0200, Jerome Forissier 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. and
> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE 

Tested-by: Tom Rini <trini@konsulko.com> # Raspberry Pi 3 (32b, 64b,
arm64), Raspberry Pi 4 (32b, 64b, arm64), am64x_evm, am62x_evm,
am62x_beagleplay.

And the Pi targets were built with gcc-13 and llvm-17.

-- 
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it.
  2024-10-04  8:36     ` Jerome Forissier
@ 2024-10-05  3:26       ` Jon Humphreys
  0 siblings, 0 replies; 76+ messages in thread
From: Jon Humphreys @ 2024-10-05  3:26 UTC (permalink / raw)
  To: Jerome Forissier, Ilias Apalodimas
  Cc: u-boot, Javier Tia, Raymond Mao, Maxim Uvarov, Tim Harvey,
	Anton Antonov, Joe Hershberger, Ramon Fried, Tom Rini

Jerome Forissier <jerome.forissier@linaro.org> writes:

> On 10/4/24 09:11, Ilias Apalodimas wrote:
>> On Thu, 3 Oct 2024 at 18:47, Jerome Forissier
>> <jerome.forissier@linaro.org> wrote:
>>>
>>> From: Jonathan Humphreys <j-humphreys@ti.com>
>> 
>> A short description is missing here
>
> I will fold this patch into the previous one since it was a review
> comment from Jonathan H. ; Jonathan I hope you don't mind?
>

No problem.

Jon

> Thanks,
> -- 
> Jerome
>
>> 
>> Thanks
>> /Ilias
>>>
>>> Signed-off-by: Jonathan Humphreys <j-humphreys@ti.com>
>>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>>> ---
>>>  net/lwip/wget.c | 6 ------
>>>  1 file changed, 6 deletions(-)
>>>
>>> diff --git a/net/lwip/wget.c b/net/lwip/wget.c
>>> index e8768fc2acd..b495ebd1aa9 100644
>>> --- a/net/lwip/wget.c
>>> +++ b/net/lwip/wget.c
>>> @@ -349,12 +349,6 @@ bool wget_validate_uri(char *uri)
>>>                 ret = false;
>>>                 goto out;
>>>         }
>>> -       s = strchr(authority, ':');
>>> -       if (s) {
>>> -               log_err("user defined port is not supported\n");
>>> -               ret = false;
>>> -               goto out;
>>> -       }
>>>
>>>  out:
>>>         free(str_copy);
>>> --
>>> 2.40.1
>>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix
  2024-10-04 18:25   ` Tom Rini
@ 2024-10-07  9:00     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-07  9:00 UTC (permalink / raw)
  To: Tom Rini
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Simon Glass, Jiaxun Yang,
	Heinrich Schuchardt



On 10/4/24 20:25, Tom Rini wrote:
> On Thu, Oct 03, 2024 at 05:46:29PM +0200, Jerome Forissier wrote:
>> Build and run qemu_arm64_lwip_defconfig in CI. This tests the lightweight
>> IP (lwIP) implementation of the dhcp, tftpboot and ping commands.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  .azure-pipelines.yml | 7 +++++++
>>  1 file changed, 7 insertions(+)
> 
> This should be in .gitlab-ci.yml too.

Updated in v12.

> Generally it's close enough to get
> without testing (and using the linter if needed), but I'm sure Ilias can
> push something through the tpm tree for testing if you want, and we
> should get you added to source.denx.de (please go sign up) and access to
> the -net tree, really, anyhow.

I have registered on source.denx.de.

Thanks Tom,
-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 00/29] Introduce the lwIP network stack
  2024-10-04 18:30 ` Tom Rini
  2024-10-04 18:36   ` Ilias Apalodimas
@ 2024-10-07 13:31   ` Jerome Forissier
  1 sibling, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-07 13:31 UTC (permalink / raw)
  To: Tom Rini
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov



On 10/4/24 20:30, Tom Rini wrote:
> On Thu, Oct 03, 2024 at 05:22:46PM +0200, Jerome Forissier 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. and
>> Raymond M. (CC'd) have 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://github.com/lwip-tcpip/lwip.git  STABLE-2_2_0_RELEASE 
> 
> So, assuming the outstanding questions raised on v11 are easy enough to
> resolve, I think v12 should be posted with being merged in mind (and so
> no TESTING patches, etc, since I'll "b4 shazam -SM" it. Thanks for
> working on this so hard!

Sure. Thanks for reviewing and testing!

-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-04 12:04   ` Heinrich Schuchardt
  2024-10-04 12:55     ` Jerome Forissier
@ 2024-10-07 15:23     ` Simon Glass
  1 sibling, 0 replies; 76+ messages in thread
From: Simon Glass @ 2024-10-07 15:23 UTC (permalink / raw)
  To: Heinrich Schuchardt
  Cc: Jerome Forissier, Ilias Apalodimas, Javier Tia, Raymond Mao,
	Maxim Uvarov, Tim Harvey, Anton Antonov, Tom Rini, Jiaxun Yang,
	Dan Carpenter, Alexander Gendin, u-boot

Hi Heinrich,

On Fri, 4 Oct 2024 at 06:16, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> On 03.10.24 17:22, Jerome Forissier wrote:
> > Note: Patch posted separately [0].
> >
> > [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
> >
> > CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
> > exception may occur. Fixes an issue found on malta64 with QEMU:
> >
> >   Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
> >   31                      if (!strcmp(name, entry->name))
> >   [...]
> >   ld      a1,0(s0)
> >
> >   (gdb) p/x &entry->name
> >   0xffffffffbe04b0d4
> >   (gdb) p/x $s0
> >   0xffffffffbe04b0d4
> >
> >   $ grep __u_boot_list /tmp/malta64/u-boot.objdump
> >   4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
> >
> > Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> > ---
> >   arch/Kconfig | 2 +-
> >   1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 8f1f4667012..8f4df849801 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
> >   config LINKER_LIST_ALIGN
> >       int
> >       default 32 if SANDBOX
> > -     default 8 if ARM64 || X86
> > +     default 8 if ARM64 || X86 || CPU_MIPS64
>
> Shouldn't we set 8 byte alignment on all 64bit architectures including
> riscv64?
>
>      default 8 if 64BIT
>
> @Simon
> I would not know why 32bit X86 should need 8 byte alignment.
> I am a bit astonished that you chose 32 byte alignment for the Sandbox.
> Is there any justification to use more than 4 on the 32bit Sandbox and
> more than 8 on the 64bit Sandbox? If yes, we should document it via a
> comment.

It was really long so I put it in the commit message. Please check
'git blame' as there is often stuff there:

linker_lists: Fix alignment issue

The linker script uses alphabetic sorting to group the different linker
lists together. Each group has its own struct and potentially its own
alignment. But when the linker packs the structs together it cannot ensure
that a linker list starts on the expected alignment boundary.

For example, if the first list has a struct size of 8 and we place 3 of
them in the image, that means that the next struct will start at offset
0x18 from the start of the linker_list section. If the next struct has
a size of 16 then it will start at an 8-byte aligned offset, but not a
16-byte aligned offset.

With sandbox on x86_64, a reference to a linker list item using
ll_entry_get() can force alignment of that particular linker_list item,
if it is in the same file as the linker_list item is declared.

Consider this example, where struct driver is 0x80 bytes:

    ll_entry_declare(struct driver, fred, driver)

...

    void *p = ll_entry_get(struct driver, fred, driver)

If these two lines of code are in the same file, then the entry is forced
to be aligned at the 'struct driver' alignment, which is 16 bytes. If the
second line of code is in a different file, then no action is taken, since
the compiler cannot update the alignment of the linker_list item.

In the first case, an 8-byte 'fill' region is added:

.u_boot_list_2_driver_2_testbus_drv
            0x0000000000270018       0x80 test/built-in.o
            0x0000000000270018
_u_boot_list_2_driver_2_testbus_drv
.u_boot_list_2_driver_2_testfdt1_drv
            0x0000000000270098       0x80 test/built-in.o
            0x0000000000270098
_u_boot_list_2_driver_2_testfdt1_drv
*fill*         0x0000000000270118        0x8
.u_boot_list_2_driver_2_testfdt_drv
            0x0000000000270120       0x80 test/built-in.o
            0x0000000000270120
_u_boot_list_2_driver_2_testfdt_drv
.u_boot_list_2_driver_2_testprobe_drv
            0x00000000002701a0       0x80 test/built-in.o
            0x00000000002701a0
_u_boot_list_2_driver_2_testprobe_drv

With this, the linker_list no-longer works since items after testfdt1_drv
are not at the expected address.

Ideally we would have a way to tell gcc not to align structs in this way.
It is not clear how we could do this, and in any case it would require us
to adjust every struct used by the linker_list feature.

One possible fix is to force each separate linker_list to start on the
largest possible boundary that can be required by the compiler. However
that does not seem to work on x86_64, which uses 16-byte alignment in this
case but needs 32-byte alignment.

So add a Kconfig option to handle this. Set the default value to 4 so
as to avoid changing platforms that don't need it.

Update the ll_entry_start() accordingly.

Regards,
Simon

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-04 12:01         ` Jerome Forissier
@ 2024-10-07 15:23           ` Simon Glass
  2024-10-08  8:49             ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Simon Glass @ 2024-10-07 15:23 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: Ilias Apalodimas, u-boot, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel

Hi Jerome,

On Fri, 4 Oct 2024 at 06:01, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
>
>
> On 10/4/24 11:37, Ilias Apalodimas wrote:
> > On Fri, 4 Oct 2024 at 11:46, Jerome Forissier
> > <jerome.forissier@linaro.org> wrote:
> >>
> >>
> >>
> >> On 10/4/24 08:55, Ilias Apalodimas wrote:
> >>> Hi Jerome,
> >>>
> >>> On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
> >>> <jerome.forissier@linaro.org> wrote:
> >>>>
> >>>> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
> >>>>
> >>>>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
> >>>>  [...]
> >>>>  Scanning for bootflows with label '9'
> >>>>  [...]
> >>>>  Cannot find '9' (err=-19)
> >>>>
> >>>> This is due to the device list containing two less entries than
> >>>> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
> >>>>
> >>>> The actual use case is NET_LWIP=y (to be introduced in later patches)
> >>>> which implies DSA_SANDBOX=n for the time being.
> >>>>
> >>>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> >>>> ---
> >>>>  test/boot/bootflow.c | 7 +++++--
> >>>>  1 file changed, 5 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
> >>>> index 6ad63afe90a..c440b8eb778 100644
> >>>> --- a/test/boot/bootflow.c
> >>>> +++ b/test/boot/bootflow.c
> >>>> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
> >>>>          * 8   [   ]      OK  mmc       mmc2.bootdev
> >>>>          * 9   [ + ]      OK  mmc       mmc1.bootdev
> >>>>          * a   [   ]      OK  mmc       mmc0.bootdev
> >>>> +        *
> >>>> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
> >>>> +        * dsa-test@1).
> >>>>          */
> >>>> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
> >>>> -       ut_assert_nextline("Scanning for bootflows with label '9'");
> >>>
> >>> Shouldn't this under and #ifdef, IS_ENABLED etc?
> >>
> >> In theory yes, but we can avoid the conditional by using index 7 which is always
> >> valid, i.e., in all configurations we have at least 7 devices (even 8 actually).
> >
> > Ok, but I *think* Simon was trying to match the exact out put here,
> > not 'at least 7'.
> >
> > I think we are better off being strict on this test
>
> No because there are 10 entries according to the comment ("a" hex being
> mmc0.bootdev). Simon, what do you suggest?

I don't think this is a huge deal.

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

BTW, 'fewer', not 'less', if you can count them


>
> Thanks,
> --
> Jerome
>
> >
> > Thanks
> > /Ilias
> >>
> >>>
> >>>> +       ut_assertok(run_command("bootflow scan -lH 7", 0));
> >>>> +       ut_assert_nextline("Scanning for bootflows with label '7'");
> >>>>         ut_assert_skip_to_line("(1 bootflow, 1 valid)");
> >>>>
> >>>>         ut_assertok(run_command("bootflow scan -lH 0", 0));
> >>>> --
> >>>> 2.40.1
> >>>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 06/29] test: boot: fix bootflow_cmd_label for when DSA_SANDBOX is disabled
  2024-10-07 15:23           ` Simon Glass
@ 2024-10-08  8:49             ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-08  8:49 UTC (permalink / raw)
  To: Simon Glass
  Cc: Ilias Apalodimas, u-boot, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Mattijs Korpershoek,
	AKASHI Takahiro, Heinrich Schuchardt, Francis Laniel



On 10/7/24 17:23, Simon Glass wrote:
> Hi Jerome,
> 
> On Fri, 4 Oct 2024 at 06:01, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>>
>>
>> On 10/4/24 11:37, Ilias Apalodimas wrote:
>>> On Fri, 4 Oct 2024 at 11:46, Jerome Forissier
>>> <jerome.forissier@linaro.org> wrote:
>>>>
>>>>
>>>>
>>>> On 10/4/24 08:55, Ilias Apalodimas wrote:
>>>>> Hi Jerome,
>>>>>
>>>>> On Thu, 3 Oct 2024 at 18:23, Jerome Forissier
>>>>> <jerome.forissier@linaro.org> wrote:
>>>>>>
>>>>>> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
>>>>>>
>>>>>>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
>>>>>>  [...]
>>>>>>  Scanning for bootflows with label '9'
>>>>>>  [...]
>>>>>>  Cannot find '9' (err=-19)
>>>>>>
>>>>>> This is due to the device list containing two less entries than
>>>>>> expected. Therefore, look for label '7' when DSA_SANDBOX is disabled.
>>>>>>
>>>>>> The actual use case is NET_LWIP=y (to be introduced in later patches)
>>>>>> which implies DSA_SANDBOX=n for the time being.
>>>>>>
>>>>>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>>>>>> ---
>>>>>>  test/boot/bootflow.c | 7 +++++--
>>>>>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>>>>>
>>>>>> diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
>>>>>> index 6ad63afe90a..c440b8eb778 100644
>>>>>> --- a/test/boot/bootflow.c
>>>>>> +++ b/test/boot/bootflow.c
>>>>>> @@ -109,9 +109,12 @@ static int bootflow_cmd_label(struct unit_test_state *uts)
>>>>>>          * 8   [   ]      OK  mmc       mmc2.bootdev
>>>>>>          * 9   [ + ]      OK  mmc       mmc1.bootdev
>>>>>>          * a   [   ]      OK  mmc       mmc0.bootdev
>>>>>> +        *
>>>>>> +        * However with CONFIG_DSA_SANDBOX=n we have two less (dsa-test@0 and
>>>>>> +        * dsa-test@1).
>>>>>>          */
>>>>>> -       ut_assertok(run_command("bootflow scan -lH 9", 0));
>>>>>> -       ut_assert_nextline("Scanning for bootflows with label '9'");
>>>>>
>>>>> Shouldn't this under and #ifdef, IS_ENABLED etc?
>>>>
>>>> In theory yes, but we can avoid the conditional by using index 7 which is always
>>>> valid, i.e., in all configurations we have at least 7 devices (even 8 actually).
>>>
>>> Ok, but I *think* Simon was trying to match the exact out put here,
>>> not 'at least 7'.
>>>
>>> I think we are better off being strict on this test
>>
>> No because there are 10 entries according to the comment ("a" hex being
>> mmc0.bootdev). Simon, what do you suggest?
> 
> I don't think this is a huge deal.
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>

Unfortunately this patch breaks the default config (NET=y and therefore
DSA_SANDBOX=y):

=> ut bootstd bootflow_cmd_label
Test: bootflow_cmd_label: bootflow.c
Scanning for bootflows with label 'mmc1'
Seq  Method       State   Uclass    Part  Name                      Filename
---  -----------  ------  --------  ----  ------------------------  ----------------
Scanning bootdev 'mmc1.bootdev':
  0  extlinux     ready   mmc          1  mmc1.bootdev.part_1       /extlinux/extlinux.conf
No more bootdevs
---  -----------  ------  --------  ----  ------------------------  ----------------
(1 bootflow, 1 valid)
Scanning for bootflows with label '0'
Seq  Method       State   Uclass    Part  Name                      Filename
---  -----------  ------  --------  ----  ------------------------  ----------------
---  -----------  ------  --------  ----  ------------------------  ----------------
(0 bootflows, 0 valid)
Scanning for bootflows with label '7'
Seq  Method       State   Uclass    Part  Name                      Filename
---  -----------  ------  --------  ----  ------------------------  ----------------
---  -----------  ------  --------  ----  ------------------------  ----------------
(0 bootflows, 0 valid)
test/boot/bootflow.c:118, bootflow_cmd_label(): console:
Expected '(1 bootflow, 1 valid)',
     got to '(0 bootflows, 0 valid)'
[...]


So for v12 I'll do what Ilias suggested:

-       ut_assertok(run_command("bootflow scan -lH 9", 0));
-       ut_assert_nextline("Scanning for bootflows with label '9'");
+       if (CONFIG_IS_ENABLED(DSA_SANDBOX)) {
+               ut_assertok(run_command("bootflow scan -lH 9", 0));
+               ut_assert_nextline("Scanning for bootflows with label '9'");
+       } else {
+               ut_assertok(run_command("bootflow scan -lH 7", 0));
+               ut_assert_nextline("Scanning for bootflows with label '7'");
+       }
        ut_assert_skip_to_line("(1 bootflow, 1 valid)");


Tested OK with DSA_SANDBOX=y as well as DSA_SANDBOX=n.

 
> BTW, 'fewer', not 'less', if you can count them

Sure :)


Thanks,
-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled
  2024-10-03 15:22 ` [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled Jerome Forissier
@ 2024-10-09  1:51   ` Simon Glass
  0 siblings, 0 replies; 76+ messages in thread
From: Simon Glass @ 2024-10-09  1:51 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Marek Vasut,
	Mattijs Korpershoek

On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> When DSA_SANDBOX is not set, the sandbox tests fail as follows:
>
>  $ ./test/py/test.py --build-dir=$(pwd) -k bootdev_test_any
>  [...]
>  Test: bootdev_test_any: bootdev.c
>  test/boot/bootdev.c:156, bootdev_test_any(): "mmc2" = media->name: Expected "mmc2", got "mmc0"
>  [...]
>
> This is due to the device list containing two less entries than
> expected. Therefore, adjust the expected index to be two less when
> DSA_SANDBOX is disabled.
>
> The actual use case is NET_LWIP=y (to be introduced in later patches)
> which implies DSA_SANDBOX=n for the time being.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  test/boot/bootdev.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>

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


> diff --git a/test/boot/bootdev.c b/test/boot/bootdev.c
> index c635d06ec25..369105ca4cf 100644
> --- a/test/boot/bootdev.c
> +++ b/test/boot/bootdev.c
> @@ -128,6 +128,7 @@ BOOTSTD_TEST(bootdev_test_labels, UTF_DM | UTF_SCAN_FDT | UTF_ETH_BOOTDEV);
>  static int bootdev_test_any(struct unit_test_state *uts)
>  {
>         struct udevice *dev, *media;
> +       char *seq;
>         int mflags;
>
>         /*
> @@ -147,8 +148,16 @@ static int bootdev_test_any(struct unit_test_state *uts)
>          * 8   [   ]      OK  mmc       mmc2.bootdev
>          * 9   [ + ]      OK  mmc       mmc1.bootdev
>          * a   [   ]      OK  mmc       mmc0.bootdev
> +        *
> +        * However if DSA_SANDBOX is disabled the dsa-test@{0,1} devices
> +        * are not there.
>          */
> -       ut_assertok(bootdev_find_by_any("8", &dev, &mflags));
> +       if (CONFIG_IS_ENABLED(DSA_SANDBOX))
> +               seq = "8";
> +       else
> +               seq = "6";
> +
> +       ut_assertok(bootdev_find_by_any(seq, &dev, &mflags));
>         ut_asserteq(UCLASS_BOOTDEV, device_get_uclass_id(dev));
>         ut_asserteq(BOOTFLOW_METHF_SINGLE_DEV, mflags);
>         media = dev_get_parent(dev);
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT
  2024-10-03 15:22 ` [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT Jerome Forissier
@ 2024-10-09  1:51   ` Simon Glass
  2024-10-09 12:31     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Simon Glass @ 2024-10-09  1:51 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Mattijs Korpershoek,
	Stefan Roese, Joshua Watt, Marek Vasut, Rasmus Villemoes,
	Jagan Teki

On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Note: Patch posted separately [0].
>
> [0] http://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
>
> AVB_BUF_ADDR, which is under "if AVB_VERIFY", defaults to
> FASTBOOT_BUF_ADDR. Therefore AVB_VERIFY should depend on FASTBOOT.
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  common/Kconfig | 1 +
>  1 file changed, 1 insertion(+)
>

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


> diff --git a/common/Kconfig b/common/Kconfig
> index 957de0c5c02..c011ab6e820 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -850,6 +850,7 @@ config AVB_VERIFY
>         depends on LIBAVB
>         depends on MMC
>         depends on PARTITION_UUIDS
> +       depends on FASTBOOT
>         help
>           This option enables compilation of bootloader-dependent operations,
>           used by Android Verified Boot 2.0 library (libavb). Includes:
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
  2024-10-03 15:22 ` [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected Jerome Forissier
@ 2024-10-09  1:51   ` Simon Glass
  2024-10-09  9:39     ` Jerome Forissier
  0 siblings, 1 reply; 76+ messages in thread
From: Simon Glass @ 2024-10-09  1:51 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Joe Hershberger, Ramon Fried, Tom Rini,
	Maxim Uvarov

On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Note: patch posted separately [0].
>
> [0] http://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/
>
> Some drivers do not behave properly when free_pkt() is called with a
> length of zero. It is an issue I observed when developing the lwIP
> series [1] (see "QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139"
> in the change log) and which I fixed incorrectly by not calling
> free_pkt() when recv() returns 0. That turned out to be wrong for two
> reasons:
>
> 1. The DM documentation [2] clearly requires it:
>
>   "The **recv** function polls for availability of a new packet. [...]
>    If there is an error [...], return 0 if you require the packet to
>    be cleaned up normally, or a negative error code otherwise (cleanup
>    not necessary or already done).
>
>    If **free_pkt** is defined, U-Boot will call it after a received
>    packet has been processed [...]. free_pkt() will be called after
>    recv(), for the same packet [...]"
>
> 2. The imx8mp_evk platform will fail with OOM errors if free_pkt() is
>    not called after recv() returns 0:
>
>    u-boot=> tftp 192.168.0.16:50M
>    Using ethernet@30be0000 device
>    TFTP from server 192.168.0.16; our IP address is 192.168.0.48
>    Filename '50M'.
>    Load address: 0x40480000
>    Loading: #######################fecmxc_recv: error allocating packetp
>    fecmxc_recv: error allocating packetp
>    fecmxc_recv: error allocating packetp
>    ...
>
> Therefore, make recv() return -EINVAL instead of 0 when no packet is
> available and the driver doesn't expect free_pkt() to be called
> subsequently.

Do you mean -EAGAIN ? Otherwise, it seems like this comment relates to
a different patch.

>
> [1] https://lists.denx.de/pipermail/u-boot/2024-August/562861.html
> [2] doc/develop/driver-model/ethernet.rst
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  drivers/net/eepro100.c | 2 +-
>  drivers/net/rtl8139.c  | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
>

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


> diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
> index d18a8d577ca..f64dbb7d6a1 100644
> --- a/drivers/net/eepro100.c
> +++ b/drivers/net/eepro100.c
> @@ -678,7 +678,7 @@ static int eepro100_recv_common(struct eepro100_priv *priv, uchar **packetp)
>         status = le16_to_cpu(desc->status);
>
>         if (!(status & RFD_STATUS_C))
> -               return 0;
> +               return -EAGAIN;
>
>         /* Valid frame status. */
>         if (status & RFD_STATUS_OK) {
> diff --git a/drivers/net/rtl8139.c b/drivers/net/rtl8139.c
> index 2e0afad089f..5f4b1e2d3a0 100644
> --- a/drivers/net/rtl8139.c
> +++ b/drivers/net/rtl8139.c
> @@ -433,7 +433,7 @@ static int rtl8139_recv_common(struct rtl8139_priv *priv, unsigned char *rxdata,
>         int length = 0;
>
>         if (inb(priv->ioaddr + RTL_REG_CHIPCMD) & RTL_REG_CHIPCMD_RXBUFEMPTY)
> -               return 0;
> +               return -EAGAIN;
>
>         priv->rxstatus = inw(priv->ioaddr + RTL_REG_INTRSTATUS);
>         /* See below for the rest of the interrupt acknowledges.  */
> --
> 2.40.1
>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP
  2024-10-03 15:22 ` [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP Jerome Forissier
  2024-10-04  7:13   ` Ilias Apalodimas
@ 2024-10-09  1:55   ` Simon Glass
  1 sibling, 0 replies; 76+ messages in thread
From: Simon Glass @ 2024-10-09  1:55 UTC (permalink / raw)
  To: Jerome Forissier
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Joe Hershberger, Ramon Fried,
	Yang Xiwen, Kever Yang, Philip Oberfichtner, Boon Khai Ng,
	Robert Marko, Jonas Karlman, Neil Armstrong, Patrice Chotard,
	Marek Vasut

On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
<jerome.forissier@linaro.org> wrote:
>
> Introduce ETH_SANDBOX_LWIP which enables a mock driver similar to
> ETH_SANDOX but without the dependencies on the legacy network stack
> (NET) so that it may be enabled when the lwIP stack (NET_LWIP) is
> introduced. The driver does nothing at this stage but its presence
> will allow dm_test_iommu_noiommu [1] to pass.
>
> [1] ./u-boot -T -c "ut dm dm_test_iommu_noiommu"
>
> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
> ---
>  drivers/net/Kconfig        | 11 +++++
>  drivers/net/Makefile       |  1 +
>  drivers/net/sandbox-lwip.c | 85 ++++++++++++++++++++++++++++++++++++++
>  3 files changed, 97 insertions(+)
>  create mode 100644 drivers/net/sandbox-lwip.c

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

I hope that you can get a few tests in there soon.

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected
  2024-10-09  1:51   ` Simon Glass
@ 2024-10-09  9:39     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-09  9:39 UTC (permalink / raw)
  To: Simon Glass
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Joe Hershberger, Ramon Fried, Tom Rini,
	Maxim Uvarov



On 10/9/24 03:51, Simon Glass wrote:
> On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> Note: patch posted separately [0].
>>
>> [0] http://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/
>>
>> Some drivers do not behave properly when free_pkt() is called with a
>> length of zero. It is an issue I observed when developing the lwIP
>> series [1] (see "QEMU CI tests for r2dplus_i82557c, r2dplus_rtl8139"
>> in the change log) and which I fixed incorrectly by not calling
>> free_pkt() when recv() returns 0. That turned out to be wrong for two
>> reasons:
>>
>> 1. The DM documentation [2] clearly requires it:
>>
>>   "The **recv** function polls for availability of a new packet. [...]
>>    If there is an error [...], return 0 if you require the packet to
>>    be cleaned up normally, or a negative error code otherwise (cleanup
>>    not necessary or already done).
>>
>>    If **free_pkt** is defined, U-Boot will call it after a received
>>    packet has been processed [...]. free_pkt() will be called after
>>    recv(), for the same packet [...]"
>>
>> 2. The imx8mp_evk platform will fail with OOM errors if free_pkt() is
>>    not called after recv() returns 0:
>>
>>    u-boot=> tftp 192.168.0.16:50M
>>    Using ethernet@30be0000 device
>>    TFTP from server 192.168.0.16; our IP address is 192.168.0.48
>>    Filename '50M'.
>>    Load address: 0x40480000
>>    Loading: #######################fecmxc_recv: error allocating packetp
>>    fecmxc_recv: error allocating packetp
>>    fecmxc_recv: error allocating packetp
>>    ...
>>
>> Therefore, make recv() return -EINVAL instead of 0 when no packet is
>> available and the driver doesn't expect free_pkt() to be called
>> subsequently.
> 
> Do you mean -EAGAIN ? Otherwise, it seems like this comment relates to
> a different patch.

Yes, good catch. I will fix the description and resend patch [1] as v2.

[1] https://patchwork.ozlabs.org/project/uboot/patch/20240927142038.879037-1-jerome.forissier@linaro.org/

> 
>>
>> [1] https://lists.denx.de/pipermail/u-boot/2024-August/562861.html
>> [2] doc/develop/driver-model/ethernet.rst
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  drivers/net/eepro100.c | 2 +-
>>  drivers/net/rtl8139.c  | 2 +-
>>  2 files changed, 2 insertions(+), 2 deletions(-)
>>
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>

Thanks,
-- 
Jerome

> 
>> diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
>> index d18a8d577ca..f64dbb7d6a1 100644
>> --- a/drivers/net/eepro100.c
>> +++ b/drivers/net/eepro100.c
>> @@ -678,7 +678,7 @@ static int eepro100_recv_common(struct eepro100_priv *priv, uchar **packetp)
>>         status = le16_to_cpu(desc->status);
>>
>>         if (!(status & RFD_STATUS_C))
>> -               return 0;
>> +               return -EAGAIN;
>>
>>         /* Valid frame status. */
>>         if (status & RFD_STATUS_OK) {
>> diff --git a/drivers/net/rtl8139.c b/drivers/net/rtl8139.c
>> index 2e0afad089f..5f4b1e2d3a0 100644
>> --- a/drivers/net/rtl8139.c
>> +++ b/drivers/net/rtl8139.c
>> @@ -433,7 +433,7 @@ static int rtl8139_recv_common(struct rtl8139_priv *priv, unsigned char *rxdata,
>>         int length = 0;
>>
>>         if (inb(priv->ioaddr + RTL_REG_CHIPCMD) & RTL_REG_CHIPCMD_RXBUFEMPTY)
>> -               return 0;
>> +               return -EAGAIN;
>>
>>         priv->rxstatus = inw(priv->ioaddr + RTL_REG_INTRSTATUS);
>>         /* See below for the rest of the interrupt acknowledges.  */
>> --
>> 2.40.1
>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT
  2024-10-09  1:51   ` Simon Glass
@ 2024-10-09 12:31     ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-09 12:31 UTC (permalink / raw)
  To: Simon Glass
  Cc: u-boot, Ilias Apalodimas, Javier Tia, Raymond Mao, Maxim Uvarov,
	Tim Harvey, Anton Antonov, Tom Rini, Mattijs Korpershoek,
	Stefan Roese, Joshua Watt, Marek Vasut, Rasmus Villemoes,
	Jagan Teki



On 10/9/24 03:51, Simon Glass wrote:
> On Thu, 3 Oct 2024 at 09:23, Jerome Forissier
> <jerome.forissier@linaro.org> wrote:
>>
>> Note: Patch posted separately [0].
>>
>> [0] http://patchwork.ozlabs.org/project/uboot/patch/20241002144845.1439316-1-jerome.forissier@linaro.org/
>>
>> AVB_BUF_ADDR, which is under "if AVB_VERIFY", defaults to
>> FASTBOOT_BUF_ADDR. Therefore AVB_VERIFY should depend on FASTBOOT.
>>
>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>> ---
>>  common/Kconfig | 1 +
>>  1 file changed, 1 insertion(+)
>>
> 
> Reviewed-by: Simon Glass <sjg@chromium.org>

Thanks. Would you mind replying to the patch linked in the description?
As I will be removing that one from lwIP v12.

Regards,
-- 
Jerome


>> diff --git a/common/Kconfig b/common/Kconfig
>> index 957de0c5c02..c011ab6e820 100644
>> --- a/common/Kconfig
>> +++ b/common/Kconfig
>> @@ -850,6 +850,7 @@ config AVB_VERIFY
>>         depends on LIBAVB
>>         depends on MMC
>>         depends on PARTITION_UUIDS
>> +       depends on FASTBOOT
>>         help
>>           This option enables compilation of bootloader-dependent operations,
>>           used by Android Verified Boot 2.0 library (libavb). Includes:
>> --
>> 2.40.1
>>

^ permalink raw reply	[flat|nested] 76+ messages in thread

* Re: [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64
  2024-10-04 18:28       ` Tom Rini
@ 2024-10-10 13:29         ` Jerome Forissier
  0 siblings, 0 replies; 76+ messages in thread
From: Jerome Forissier @ 2024-10-10 13:29 UTC (permalink / raw)
  To: Tom Rini
  Cc: Heinrich Schuchardt, Ilias Apalodimas, Javier Tia, Raymond Mao,
	Maxim Uvarov, Tim Harvey, Anton Antonov, Simon Glass, Jiaxun Yang,
	Dan Carpenter, Alexander Gendin, u-boot



On 10/4/24 20:28, Tom Rini wrote:
> On Fri, Oct 04, 2024 at 02:55:58PM +0200, Jerome Forissier wrote:
>>
>>
>> On 10/4/24 14:04, Heinrich Schuchardt wrote:
>>> On 03.10.24 17:22, Jerome Forissier wrote:
>>>> Note: Patch posted separately [0].
>>>>
>>>> [0] https://patchwork.ozlabs.org/project/uboot/patch/20241003142030.1610222-1-jerome.forissier@linaro.org/
>>>>
>>>> CPU_MIPS64 needs 8-byte alignment on the linker lists, otherwise an
>>>> exception may occur. Fixes an issue found on malta64 with QEMU:
>>>>
>>>>   Breakpoint 1, lists_driver_lookup_name (name=0xffffffffbe043578 "root_driver") at /home/uboot/u-boot/drivers/core/lists.c:31
>>>>   31                      if (!strcmp(name, entry->name))
>>>>   [...]
>>>>   ld      a1,0(s0)
>>>>
>>>>   (gdb) p/x &entry->name
>>>>   0xffffffffbe04b0d4
>>>>   (gdb) p/x $s0
>>>>   0xffffffffbe04b0d4
>>>>
>>>>   $ grep __u_boot_list /tmp/malta64/u-boot.objdump
>>>>   4 __u_boot_list 000018e0  ffffffffbe04a4d4  ffffffffbe04a4d4  0004a584  2**2
>>>>
>>>> Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
>>>> ---
>>>>   arch/Kconfig | 2 +-
>>>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/arch/Kconfig b/arch/Kconfig
>>>> index 8f1f4667012..8f4df849801 100644
>>>> --- a/arch/Kconfig
>>>> +++ b/arch/Kconfig
>>>> @@ -45,7 +45,7 @@ config SYS_CACHELINE_SIZE
>>>>   config LINKER_LIST_ALIGN
>>>>       int
>>>>       default 32 if SANDBOX
>>>> -    default 8 if ARM64 || X86
>>>> +    default 8 if ARM64 || X86 || CPU_MIPS64
>>>
>>> Shouldn't we set 8 byte alignment on all 64bit architectures including
>>> riscv64?
>>>
>>>     default 8 if 64BIT
>>
>> Makes sense.
>>
>>>
>>> @Simon
>>> I would not know why 32bit X86 should need 8 byte alignment.
>>> I am a bit astonished that you chose 32 byte alignment for the Sandbox.
>>> Is there any justification to use more than 4 on the 32bit Sandbox and
>>> more than 8 on the 64bit Sandbox? If yes, we should document it via a
>>> comment.
>>
>> I tried running what CI does manually (.azure_pipelines.yml) with
>> "default 32 if SANDBOX" removed, and I got SIGSEGV with
>> TEST_PY_BD=sandbox. OTOH, TEST_PY_BD=sandbox64 worked fine but it might
>> have been a fluke.
> 
> I think we can leave sandbox as a future cleanup, and perhaps file an
> issue at https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/ so
> it doesn't get lost.

https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/29

Thanks,
-- 
Jerome

^ permalink raw reply	[flat|nested] 76+ messages in thread

end of thread, other threads:[~2024-10-10 13:29 UTC | newest]

Thread overview: 76+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-03 15:22 [PATCH v11 00/29] Introduce the lwIP network stack Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 01/29] net: recv(): return -EAGAIN instead of 0 when no cleanup is expected Jerome Forissier
2024-10-09  1:51   ` Simon Glass
2024-10-09  9:39     ` Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 02/29] Make AVB_VERIFY depend on FASTBOOT Jerome Forissier
2024-10-09  1:51   ` Simon Glass
2024-10-09 12:31     ` Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 03/29] linker_lists: set LINKER_LIST_ALIGN to 8 for CPU_MIPS64 Jerome Forissier
2024-10-04  7:12   ` Ilias Apalodimas
2024-10-04 12:04   ` Heinrich Schuchardt
2024-10-04 12:55     ` Jerome Forissier
2024-10-04 18:28       ` Tom Rini
2024-10-10 13:29         ` Jerome Forissier
2024-10-07 15:23     ` Simon Glass
2024-10-03 15:22 ` [PATCH v11 04/29] sandbox: add dummy driver ETH_SANDBOX_LWIP Jerome Forissier
2024-10-04  7:13   ` Ilias Apalodimas
2024-10-09  1:55   ` Simon Glass
2024-10-03 15:22 ` [PATCH v11 05/29] test: boot: fix bootdev_test_any for when DSA_SANDBOX is disabled Jerome Forissier
2024-10-09  1:51   ` Simon Glass
2024-10-03 15:22 ` [PATCH v11 06/29] test: boot: fix bootflow_cmd_label " Jerome Forissier
2024-10-04  6:55   ` Ilias Apalodimas
2024-10-04  8:46     ` Jerome Forissier
2024-10-04  9:37       ` Ilias Apalodimas
2024-10-04 12:01         ` Jerome Forissier
2024-10-07 15:23           ` Simon Glass
2024-10-08  8:49             ` Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 07/29] net: introduce alternative implementation as net-lwip/ Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 08/29] configs: replace '# CONFIG_NET is not set' with CONFIG_NO_NET=y Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 09/29] net: split include/net.h into net{, -common, -legacy, -lwip}.h Jerome Forissier
2024-10-04  6:00   ` Ilias Apalodimas
2024-10-03 15:22 ` [PATCH v11 10/29] net: move copy_filename() to new file net/net-common.c Jerome Forissier
2024-10-04  6:52   ` Ilias Apalodimas
2024-10-04  8:01     ` Jerome Forissier
2024-10-03 15:22 ` [PATCH v11 11/29] net: eth-uclass: add function eth_start_udev() Jerome Forissier
2024-10-04  6:04   ` Ilias Apalodimas
2024-10-03 15:46 ` [PATCH v11 12/29] net-lwip: build lwIP Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 13/29] net-lwip: add DHCP support and dhcp commmand Jerome Forissier
2024-10-04  6:50   ` Ilias Apalodimas
2024-10-04  8:43     ` Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 14/29] lwip: tftp: bind to TFTP port only when in server mode Jerome Forissier
2024-10-04  6:11   ` Ilias Apalodimas
2024-10-04  9:07     ` Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 15/29] net-lwip: add TFTP support and tftpboot command Jerome Forissier
2024-10-04 12:02   ` Ilias Apalodimas
2024-10-03 15:46 ` [PATCH v11 16/29] net-lwip: add ping command Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 17/29] net-lwip: add dns command Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 18/29] net: split cmd/net.c into cmd/net.c and cmd/net-common.c Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 19/29] net-lwip: add wget command Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 20/29] net-lwip: lwIP wget supports user defined port in the uri, so allow it Jerome Forissier
2024-10-04  7:11   ` Ilias Apalodimas
2024-10-04  8:36     ` Jerome Forissier
2024-10-05  3:26       ` Jon Humphreys
2024-10-03 15:46 ` [PATCH v11 21/29] cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 22/29] configs: add qemu_arm64_lwip_defconfig Jerome Forissier
2024-10-03 16:44   ` Ilias Apalodimas
2024-10-03 15:46 ` [PATCH v11 23/29] lwip: tftp: add support of blksize option to client Jerome Forissier
2024-10-04  6:41   ` Ilias Apalodimas
2024-10-03 15:46 ` [PATCH v11 24/29] net-lwip: add TFTP_BLOCKSIZE Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 25/29] CI: add qemu_arm64_lwip to the test matrix Jerome Forissier
2024-10-04  6:05   ` Ilias Apalodimas
2024-10-04 18:25   ` Tom Rini
2024-10-07  9:00     ` Jerome Forissier
2024-10-03 15:46 ` [PATCH v11 26/29] MAINTAINERS: net-lwip: add myself as a maintainer Jerome Forissier
2024-10-03 16:02   ` Ilias Apalodimas
2024-10-03 15:46 ` [PATCH v11 27/29] configs: use syntax CONFIG_FOO=n in tools-only_defconfig Jerome Forissier
2024-10-04  6:01   ` Ilias Apalodimas
2024-10-03 15:47 ` [PATCH v11 28/29] [TESTING] configs: set CONFIG_NET=y for FTGMAC100 Jerome Forissier
2024-10-04  6:05   ` Ilias Apalodimas
2024-10-03 15:47 ` [PATCH v11 29/29] [TESTING] Kconfig: enable NET_LWIP by default Jerome Forissier
2024-10-03 16:00 ` [PATCH v11 00/29] Introduce the lwIP network stack Ilias Apalodimas
2024-10-03 16:10   ` Jerome Forissier
2024-10-03 16:11     ` Ilias Apalodimas
2024-10-04 18:30 ` Tom Rini
2024-10-04 18:36   ` Ilias Apalodimas
2024-10-07 13:31   ` Jerome Forissier
2024-10-04 19:15 ` Tom Rini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox