@@ -5,9 +5,12 @@
menuconfig NET
bool "Networking support"
default y
+ imply LWIP
if NET
+source net/lwip/Kconfig
+
config ARP_TIMEOUT
int "Milliseconds before trying ARP again"
default 5000
@@ -33,6 +33,7 @@ obj-$(CONFIG_CMD_WOL) += wol.o
obj-$(CONFIG_PROT_UDP) += udp.o
obj-$(CONFIG_PROT_TCP) += tcp.o
obj-$(CONFIG_CMD_WGET) += wget.o
+obj-$(CONFIG_LWIP) += lwip/
# Disable this warning as it is triggered by:
# sprintf(buf, index ? "foo%d" : "foo", index)
new file mode 100644
@@ -0,0 +1,25 @@
+menu "lwIP"
+config LWIP
+ bool "Support LWIP library"
+ help
+ Enable the lwIP library code with
+ all dependencies (commands are implemented with lwIP
+ library. This option is automatically enabled if CONFIG_NET=y.
+ lwIP library (https://git.savannah.nongnu.org/git/lwip.git) provides
+ network stack and application code for U-Boot commands.
+ Please see doc/develop/net_lwip.rst for more details.
+
+menu "LWIP options"
+
+config LWIP_LIB_DEBUG
+ bool "enable debug"
+ default n
+
+config LWIP_LIB_NOASSERT
+ bool "disable asserts"
+ default y
+ help
+ Disabling asserts reduces binary size by 16k.
+endmenu
+
+endmenu
new file mode 100644
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2023 Linaro Ltd. <maxim.uvarov@linaro.org>
+
+ccflags-y += -I$(srctree)/net/lwip/port/include
+ccflags-y += -I$(srctree)/net/lwip/lwip-external/src/include -I$(srctree)/net/lwip
+
+obj-$(CONFIG_NET) += lwip-external/src/core/init.o \
+ lwip-external/src/core/def.o \
+ lwip-external/src/core/dns.o \
+ lwip-external/src/core/inet_chksum.o \
+ lwip-external/src/core/ip.o \
+ lwip-external/src/core/mem.o \
+ lwip-external/src/core/memp.o \
+ lwip-external/src/core/netif.o \
+ lwip-external/src/core/pbuf.o \
+ lwip-external/src/core/raw.o \
+ lwip-external/src/core/stats.o \
+ lwip-external/src/core/sys.o \
+ lwip-external/src/core/altcp.o \
+ lwip-external/src/core/altcp_alloc.o \
+ lwip-external/src/core/altcp_tcp.o \
+ lwip-external/src/core/tcp.o \
+ lwip-external/src/core/tcp_in.o \
+ lwip-external/src/core/tcp_out.o \
+ lwip-external/src/core/timeouts.o \
+ lwip-external/src/core/udp.o
+
+# IPv4
+obj-$(CONFIG_NET) += lwip-external/src/core/ipv4/acd.o \
+ lwip-external/src/core/ipv4/autoip.o \
+ lwip-external/src/core/ipv4/dhcp.o \
+ lwip-external/src/core/ipv4/etharp.o \
+ lwip-external/src/core/ipv4/icmp.o \
+ lwip-external/src/core/ipv4/igmp.o \
+ lwip-external/src/core/ipv4/ip4_frag.o \
+ lwip-external/src/core/ipv4/ip4.o \
+ lwip-external/src/core/ipv4/ip4_addr.o
+# IPv6
+obj-$(CONFIG_NET) += lwip-external/src/core/ipv6/dhcp6.o \
+ lwip-external/src/core/ipv6/ethip6.o \
+ lwip-external/src/core/ipv6/icmp6.o \
+ lwip-external/src/core/ipv6/inet6.o \
+ lwip-external/src/core/ipv6/ip6.o \
+ lwip-external/src/core/ipv6/ip6_addr.o \
+ lwip-external/src/core/ipv6/ip6_frag.o \
+ lwip-external/src/core/ipv6/mld6.o \
+ lwip-external/src/core/ipv6/nd6.o
+# API
+obj-$(CONFIG_NET) += lwip-external/src/api/api_lib.o \
+ lwip-external/src/api/api_msg.o \
+ lwip-external/src/api/err.o \
+ lwip-external/src/api/if_api.o \
+ lwip-external/src/api/netbuf.o \
+ lwip-external/src/api/netdb.o \
+ lwip-external/src/api/netifapi.o \
+ lwip-external/src/api/sockets.o \
+ lwip-external/src/api/tcpip.o
+
+# Netdevs
+obj-$(CONFIG_NET) += lwip-external/src/netif/ethernet.o
+
+obj-$(CONFIG_NET) += port/if.o
+obj-$(CONFIG_NET) += port/sys-arch.o
@@ -125,6 +125,7 @@
#endif
#include "dhcpv6.h"
#include "net_rand.h"
+#include <net/ulwip.h>
/** BOOTP EXTENTIONS **/
@@ -452,7 +453,9 @@ int net_loop(enum proto_t protocol)
#endif
bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
- net_init();
+ if (!ulwip_enabled() || !ulwip_in_loop())
+ net_init();
+
if (eth_is_on_demand_init()) {
eth_halt();
eth_set_current();
@@ -649,6 +652,16 @@ restart:
*/
eth_rx();
+ if (ulwip_enabled()) {
+ net_set_state(NETLOOP_CONTINUE);
+ if (!ulwip_in_loop()) {
+ if (ulwip_app_get_err())
+ net_set_state(NETLOOP_FAIL);
+ else
+ net_set_state(NETLOOP_SUCCESS);
+ goto done;
+ }
+ }
/*
* Abort if ctrl-c was pressed.
*/
@@ -1213,6 +1226,11 @@ void net_process_received_packet(uchar *in_packet, int len)
if (len < ETHER_HDR_SIZE)
return;
+ if (ulwip_enabled()) {
+ ulwip_poll();
+ return;
+ }
+
#if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
if (push_packet) {
(*push_packet)(in_packet, len);
Define Makefile and Kconfig to build lwIP inside the U-Boot. We compile lwIP the same as the main code, plus we can do optimization for size at compile time with disabling not needed debug asserts, or not used protocols. So we can tune lwIP configuration specially for U-Boot environments. Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> --- net/Kconfig | 3 +++ net/Makefile | 1 + net/lwip/Kconfig | 25 ++++++++++++++++++ net/lwip/Makefile | 64 +++++++++++++++++++++++++++++++++++++++++++++++ net/net.c | 20 ++++++++++++++- 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 net/lwip/Kconfig create mode 100644 net/lwip/Makefile