Save the struct netif pointer in the corresponding struct udevice when the netif is created. This avoids needlessly re-creating devices each time the lwIP stack is entered.
Replace functions net_lwip_new_netif() and net_lwip_new_netif_noip() with net_lwip_netif() and net_lwip_netif_noip() respectively since they return a new structure only the first time. Signed-off-by: Jerome Forissier <jerome.foriss...@linaro.org> --- include/net-lwip.h | 4 ++-- net/lwip/dhcp.c | 7 ++----- net/lwip/dns.c | 5 +---- net/lwip/net-lwip.c | 19 +++++++++++-------- net/lwip/ping.c | 8 ++------ net/lwip/tftp.c | 5 +---- net/lwip/wget.c | 9 ++------- 7 files changed, 21 insertions(+), 36 deletions(-) diff --git a/include/net-lwip.h b/include/net-lwip.h index 64e5c720560..58ff2bb2d43 100644 --- a/include/net-lwip.h +++ b/include/net-lwip.h @@ -11,8 +11,8 @@ enum proto_t { }; void net_lwip_set_current(void); -struct netif *net_lwip_new_netif(struct udevice *udev); -struct netif *net_lwip_new_netif_noip(struct udevice *udev); +struct netif *net_lwip_netif(struct udevice *udev); +struct netif *net_lwip_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); diff --git a/net/lwip/dhcp.c b/net/lwip/dhcp.c index 3b7e4700c6e..4c621e52337 100644 --- a/net/lwip/dhcp.c +++ b/net/lwip/dhcp.c @@ -43,7 +43,7 @@ static int dhcp_loop(struct udevice *udev) return CMD_RET_FAILURE; } - netif = net_lwip_new_netif_noip(udev); + netif = net_lwip_netif_noip(udev); if (!netif) return CMD_RET_FAILURE; @@ -70,10 +70,8 @@ static int dhcp_loop(struct udevice *udev) sys_untimeout(call_lwip_dhcp_fine_tmr, NULL); - if (!bound) { - net_lwip_remove_netif(netif); + if (!bound) return CMD_RET_FAILURE; - } dhcp = netif_dhcp_data(netif); @@ -106,7 +104,6 @@ static int dhcp_loop(struct udevice *udev) 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; } diff --git a/net/lwip/dns.c b/net/lwip/dns.c index 149bdb784dc..65474055cff 100644 --- a/net/lwip/dns.c +++ b/net/lwip/dns.c @@ -54,7 +54,7 @@ static int dns_loop(struct udevice *udev, const char *name, const char *var) dns_cb_arg.var = var; - netif = net_lwip_new_netif(udev); + netif = net_lwip_netif(udev); if (!netif) return CMD_RET_FAILURE; @@ -74,7 +74,6 @@ static int dns_loop(struct udevice *udev, const char *name, const char *var) if (!has_server) { log_err("No valid name server (dnsip/dnsip2)\n"); - net_lwip_remove_netif(netif); return CMD_RET_FAILURE; } @@ -100,8 +99,6 @@ static int dns_loop(struct udevice *udev, const char *name, const char *var) 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; diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c index cab1dd7d483..77f16f8af9c 100644 --- a/net/lwip/net-lwip.c +++ b/net/lwip/net-lwip.c @@ -141,7 +141,7 @@ void net_lwip_set_current(void) eth_set_current(); } -static struct netif *new_netif(struct udevice *udev, bool with_ip) +static struct netif *get_or_create_netif(struct udevice *udev, bool with_ip) { unsigned char enetaddr[ARP_HLEN]; char hwstr[MAC_ADDR_STRLEN]; @@ -152,13 +152,14 @@ static struct netif *new_netif(struct udevice *udev, bool with_ip) if (!udev) return NULL; + if (udev->netif) + return udev->netif; + 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); @@ -198,17 +199,19 @@ static struct netif *new_netif(struct udevice *udev, bool with_ip) /* Routing: use this interface to reach the default gateway */ netif_set_default(netif); + udev->netif = netif; + return netif; } -struct netif *net_lwip_new_netif(struct udevice *udev) +struct netif *net_lwip_netif(struct udevice *udev) { - return new_netif(udev, true); + return get_or_create_netif(udev, true); } -struct netif *net_lwip_new_netif_noip(struct udevice *udev) +struct netif *net_lwip_netif_noip(struct udevice *udev) { - return new_netif(udev, false); + return get_or_create_netif(udev, false); } void net_lwip_remove_netif(struct netif *netif) @@ -221,7 +224,7 @@ int net_init(void) { eth_set_current(); - net_lwip_new_netif(eth_get_dev()); + net_lwip_netif(eth_get_dev()); return 0; } diff --git a/net/lwip/ping.c b/net/lwip/ping.c index 200a702bbb5..6dc8f88782b 100644 --- a/net/lwip/ping.c +++ b/net/lwip/ping.c @@ -119,17 +119,15 @@ static int ping_loop(struct udevice *udev, const ip_addr_t *addr) struct netif *netif; int ret; - netif = net_lwip_new_netif(udev); + netif = net_lwip_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); + if (ret < 0) return ret; - } ctx.target = *addr; @@ -149,8 +147,6 @@ static int ping_loop(struct udevice *udev, const ip_addr_t *addr) sys_untimeout(ping_send, &ctx); ping_raw_stop(&ctx); - net_lwip_remove_netif(netif); - if (ctx.alive) return 0; diff --git a/net/lwip/tftp.c b/net/lwip/tftp.c index 123d66b5dba..aae1b3bbad3 100644 --- a/net/lwip/tftp.c +++ b/net/lwip/tftp.c @@ -119,7 +119,7 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname, if (!srvport) srvport = TFTP_PORT; - netif = net_lwip_new_netif(udev); + netif = net_lwip_netif(udev); if (!netif) return -1; @@ -146,7 +146,6 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname, /* 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; } @@ -162,8 +161,6 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname, tftp_cleanup(); - net_lwip_remove_netif(netif); - if (ctx.done == SUCCESS) { if (env_set_hex("fileaddr", addr)) { log_err("fileaddr not updated\n"); diff --git a/net/lwip/wget.c b/net/lwip/wget.c index 14f27d42998..b191c95e251 100644 --- a/net/lwip/wget.c +++ b/net/lwip/wget.c @@ -307,7 +307,7 @@ static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri) if (parse_url(uri, ctx.server_name, &ctx.port, &path, &is_https)) return CMD_RET_USAGE; - netif = net_lwip_new_netif(udev); + netif = net_lwip_netif(udev); if (!netif) return -1; @@ -320,7 +320,6 @@ static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri) if (!tls_allocator.arg) { log_err("error: Cannot create a TLS connection\n"); - net_lwip_remove_netif(netif); return -1; } @@ -332,10 +331,8 @@ static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri) conn.headers_done_fn = httpc_headers_done_cb; ctx.path = path; if (httpc_get_file_dns(ctx.server_name, ctx.port, path, &conn, httpc_recv_cb, - &ctx, &state)) { - net_lwip_remove_netif(netif); + &ctx, &state)) return CMD_RET_FAILURE; - } while (!ctx.done) { net_lwip_rx(udev, netif); @@ -344,8 +341,6 @@ static int wget_loop(struct udevice *udev, ulong dst_addr, char *uri) break; } - net_lwip_remove_netif(netif); - if (ctx.done == SUCCESS) return 0; -- 2.43.0