[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