[PATCH v2 3/3] net: lwip: introduce net_lwip_eth_stop() function
David Lechner
dlechner at baylibre.com
Wed May 13 15:56:45 CEST 2026
On 5/13/26 2:57 AM, Jerome Forissier wrote:
>
>
> On 12/05/2026 23:48, David Lechner wrote:
>> Add a introduce net_lwip_eth_stop() function and use that to stop the
>> network interface after each command that uses the network.
>>
>> This makes the behavior the same as the legacy net code and avoids
>> potential issues with the network interface being left in an active
>> state after a command finishes.
>>
>> Signed-off-by: David Lechner <dlechner at baylibre.com>
>> ---
>> cmd/lwip/ping.c | 10 ++++++++--
>> cmd/lwip/sntp.c | 10 ++++++++--
>> include/net-lwip.h | 1 +
>> net/lwip/dhcp.c | 15 +++++++++++----
>> net/lwip/dns.c | 7 ++++++-
>> net/lwip/net-lwip.c | 5 +++++
>> net/lwip/nfs.c | 4 ++++
>> net/lwip/tftp.c | 4 ++++
>> net/lwip/wget.c | 5 ++++-
>> 9 files changed, 51 insertions(+), 10 deletions(-)
>>
>> diff --git a/cmd/lwip/ping.c b/cmd/lwip/ping.c
>> index fc4cf7bde5f..836d1d8287f 100644
>> --- a/cmd/lwip/ping.c
>> +++ b/cmd/lwip/ping.c
>> @@ -163,6 +163,7 @@ static int ping_loop(struct udevice *udev, const ip_addr_t *addr)
>> int do_ping(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>> {
>> ip_addr_t addr;
>> + int ret = CMD_RET_FAILURE;
>>
>> if (argc < 2)
>> return CMD_RET_USAGE;
>> @@ -176,8 +177,13 @@ restart:
>> if (net_start_again() == 0)
>> goto restart;
>> else
>> - return CMD_RET_FAILURE;
>> + goto out;
>> }
>>
>> - return CMD_RET_SUCCESS;
>> + ret = CMD_RET_SUCCESS;
>> +
>> +out:
>> + net_lwip_eth_stop();
>> +
>> + return ret;
>> }
>> diff --git a/cmd/lwip/sntp.c b/cmd/lwip/sntp.c
>> index 608345c873b..5fa400b104a 100644
>> --- a/cmd/lwip/sntp.c
>> +++ b/cmd/lwip/sntp.c
>> @@ -101,6 +101,7 @@ int do_sntp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>> ip_addr_t *srvip;
>> char *server;
>> ip_addr_t ipaddr;
>> + int ret = CMD_RET_FAILURE;
>>
>> switch (argc) {
>> case 1:
>> @@ -127,7 +128,12 @@ int do_sntp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>> return CMD_RET_FAILURE;
>>
>> if (sntp_loop(eth_get_dev(), srvip) < 0)
>> - return CMD_RET_FAILURE;
>> + goto out;
>> +
>> + ret = CMD_RET_SUCCESS;
>> +
>> +out:
>> + net_lwip_eth_stop();
>>
>> - return CMD_RET_SUCCESS;
>> + return ret;
>> }
>> diff --git a/include/net-lwip.h b/include/net-lwip.h
>> index 20cb0992cce..5d0627eb271 100644
>> --- a/include/net-lwip.h
>> +++ b/include/net-lwip.h
>> @@ -35,6 +35,7 @@ int eth_init_state_only(void); /* Set active state */
>>
>> int net_lwip_dns_init(void);
>> int net_lwip_eth_start(void);
>> +void net_lwip_eth_stop(void);
>> 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/net/lwip/dhcp.c b/net/lwip/dhcp.c
>> index acdf601d7eb..18dc36ae7ca 100644
>> --- a/net/lwip/dhcp.c
>> +++ b/net/lwip/dhcp.c
>> @@ -138,18 +138,25 @@ int do_dhcp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
>> dev = eth_get_dev();
>> if (!dev) {
>> log_err("No network device\n");
>> - return CMD_RET_FAILURE;
>> + ret = CMD_RET_FAILURE;
>> + goto out;
>> }
>>
>> ret = dhcp_loop(dev);
>> if (ret)
>> - return ret;
>> + goto out;
>>
>> if (argc > 1) {
>> struct cmd_tbl cmdtp = {};
>>
>> - return do_tftpb(&cmdtp, 0, argc, argv);
>> + ret = do_tftpb(&cmdtp, 0, argc, argv);
>> + goto out;
>
> do_tftpb() already takes care of net_lwip_eth_stop() so this should
> probably be:
>
> + return do_tftpb(&cmdtp, 0, argc, argv);
>
> But this also raises the qestion of the double call to
> net_lwip_eth_start():
>
> do_dhcp()
> net_lwip_eth_start()
> do_tftpb()
> net_lwip_eth_start()
>
> How about adding a static counter to better deal with the nested case?
>
> static int net_lwip_eth_started;
>
> int net_lwip_eth_start(void)
> {
> int ret;
>
> if (net_lwip_eth_started++ > 0)
> return 0;
>
> ret = eth_init();
> if (ret) {
> net_lwip_eth_started--;
> return ret;
> }
>
> return 0;
> }
>
> void net_lwip_eth_stop(void)
> {
> if (!net_lwip_eth_started)
> return;
>
> if (--net_lwip_eth_started)
> return;
>
> eth_halt();
> }
>
> Thanks,
Yes, I like this idea. There is also an odd case in do_ping() that
we will need to look at though. It currently would not work with
reference counting since net_lwip_eth_start() can be called multiple
times on retries.
More information about the U-Boot
mailing list