---
 lib/Kconfig       |  2 ++
 lib/Makefile      |  3 +++
 lib/lwip/Kconfig  | 67 +++++++++++++++++++++++++++++++++++++++++++++++
 lib/lwip/Makefile | 66 ++++++++++++++++++++++++++++++++++++++++++++++
 net/Kconfig       |  1 +
 net/net.c         | 24 +++++++++++++++++
 6 files changed, 163 insertions(+)
 create mode 100644 lib/lwip/Kconfig
 create mode 100644 lib/lwip/Makefile

diff --git a/lib/Kconfig b/lib/Kconfig
index 3926652db6..79f7d5bc5d 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -1112,3 +1112,5 @@ menu "FWU Multi Bank Updates"
 source lib/fwu_updates/Kconfig
 
 endmenu
+
+source lib/lwip/Kconfig
diff --git a/lib/Makefile b/lib/Makefile
index 8d8ccc8bbc..598b5755dd 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_EFI_LOADER) += efi_loader/
 obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest/
 obj-$(CONFIG_FWU_MULTI_BANK_UPDATE) += fwu_updates/
 obj-$(CONFIG_LZMA) += lzma/
+obj-$(CONFIG_LWIP_LIB) += lwip/
 obj-$(CONFIG_BZIP2) += bzip2/
 obj-$(CONFIG_FIT) += libfdt/
 obj-$(CONFIG_OF_LIVE) += of_live.o
@@ -92,6 +93,8 @@ obj-$(CONFIG_LIBAVB) += libavb/
 obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/
 obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o
 
+obj-y += 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/Kconfig b/lib/lwip/Kconfig
new file mode 100644
index 0000000000..5d2603701c
--- /dev/null
+++ b/lib/lwip/Kconfig
@@ -0,0 +1,67 @@
+menu "LWIP"
+config LWIP_LIB
+       bool "Support LWIP library"
+       help
+          This option will enable the lwIP library code with
+          all dependencies (cmd commands 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 cmd commands.
+
+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 on 16k.
+
+config LWIP_LIB_TCP
+        bool "tcp"
+        default y
+
+config LWIP_LIB_UDP
+        bool "udp"
+        default y
+
+config LWIP_LIB_DNS
+        bool "dns"
+        default y
+
+config LWIP_LIB_DHCP
+        bool "dhcp"
+        default y
+
+config LWIP_LIB_LOOPBACK
+        bool "loopback"
+        help
+          Increases size on 1k.
+
+config LWIP_LIB_SOCKET
+        bool "socket API"
+
+config LWIP_LIB_NETCONN
+        bool "netconn API"
+
+config LWIP_LIB_MEM_SIZE
+       int "mem size"
+       default 1600
+       range 1 4096
+       help
+           MEM_SIZE: the size of the heap memory. If the application will send
+           a lot of data that needs to be copied, this should be set high.
+
+config LWIP_LIB_PBUF_LINK_HLEN
+        int "pbuf link hlen"
+        default 14
+        range 4 1024
+        help
+          PBUF_LINK_HLEN: the number of bytes that should be allocated for a
+           link level header. The default is 14, the standard value for 
Ethernet.
+endmenu
+
+endmenu
diff --git a/lib/lwip/Makefile b/lib/lwip/Makefile
new file mode 100644
index 0000000000..35f34d7afa
--- /dev/null
+++ b/lib/lwip/Makefile
@@ -0,0 +1,66 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# (C) Copyright 2023 Linaro Ltd. <maxim.uva...@linaro.org>
+
+LWIPDIR=lwip-external/src
+
+ccflags-y += -I$(srctree)/lib/lwip/port/include
+ccflags-y += -I$(srctree)/lib/lwip/lwip-external/src/include 
-I$(srctree)/lib/lwip
+
+obj-$(CONFIG_NET) += $(LWIPDIR)/core/init.o \
+       $(LWIPDIR)/core/def.o \
+       $(LWIPDIR)/core/dns.o \
+       $(LWIPDIR)/core/inet_chksum.o \
+       $(LWIPDIR)/core/ip.o \
+       $(LWIPDIR)/core/mem.o \
+       $(LWIPDIR)/core/memp.o \
+       $(LWIPDIR)/core/netif.o \
+       $(LWIPDIR)/core/pbuf.o \
+       $(LWIPDIR)/core/raw.o \
+       $(LWIPDIR)/core/stats.o \
+       $(LWIPDIR)/core/sys.o \
+       $(LWIPDIR)/core/altcp.o \
+       $(LWIPDIR)/core/altcp_alloc.o \
+       $(LWIPDIR)/core/altcp_tcp.o \
+       $(LWIPDIR)/core/tcp.o \
+       $(LWIPDIR)/core/tcp_in.o \
+       $(LWIPDIR)/core/tcp_out.o \
+       $(LWIPDIR)/core/timeouts.o \
+       $(LWIPDIR)/core/udp.o
+
+# IPv4
+obj-$(CONFIG_NET) += $(LWIPDIR)/core/ipv4/acd.o \
+        $(LWIPDIR)/core/ipv4/autoip.o \
+        $(LWIPDIR)/core/ipv4/dhcp.o \
+        $(LWIPDIR)/core/ipv4/etharp.o \
+        $(LWIPDIR)/core/ipv4/icmp.o \
+        $(LWIPDIR)/core/ipv4/igmp.o \
+        $(LWIPDIR)/core/ipv4/ip4_frag.o \
+        $(LWIPDIR)/core/ipv4/ip4.o \
+        $(LWIPDIR)/core/ipv4/ip4_addr.o
+# IPv6
+obj-$(CONFIG_NET) += $(LWIPDIR)/core/ipv6/dhcp6.o \
+        $(LWIPDIR)/core/ipv6/ethip6.o \
+        $(LWIPDIR)/core/ipv6/icmp6.o \
+        $(LWIPDIR)/core/ipv6/inet6.o \
+        $(LWIPDIR)/core/ipv6/ip6.o \
+        $(LWIPDIR)/core/ipv6/ip6_addr.o \
+        $(LWIPDIR)/core/ipv6/ip6_frag.o \
+        $(LWIPDIR)/core/ipv6/mld6.o \
+        $(LWIPDIR)/core/ipv6/nd6.o
+# API
+obj-$(CONFIG_NET) += $(LWIPDIR)/api/api_lib.o \
+       $(LWIPDIR)/api/api_msg.o \
+       $(LWIPDIR)/api/err.o \
+       $(LWIPDIR)/api/if_api.o \
+       $(LWIPDIR)/api/netbuf.o \
+       $(LWIPDIR)/api/netdb.o \
+       $(LWIPDIR)/api/netifapi.o \
+       $(LWIPDIR)/api/sockets.o \
+       $(LWIPDIR)/api/tcpip.o
+
+# Netdevs
+obj-$(CONFIG_NET) += $(LWIPDIR)/netif/ethernet.o
+
+obj-$(CONFIG_NET) += port/if.o
+obj-$(CONFIG_NET) += port/sys-arch.o
diff --git a/net/Kconfig b/net/Kconfig
index 4215889127..c3f4a7cae7 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -5,6 +5,7 @@
 menuconfig NET
        bool "Networking support"
        default y
+       select LWIP_LIB
 
 if NET
 
diff --git a/net/net.c b/net/net.c
index 43abbac7c3..d98e51cb80 100644
--- a/net/net.c
+++ b/net/net.c
@@ -125,6 +125,7 @@
 #endif
 #include "dhcpv6.h"
 #include "net_rand.h"
+#include "../lib/lwip/ulwip.h"
 
 /** BOOTP EXTENTIONS **/
 
@@ -452,7 +453,11 @@ int net_loop(enum proto_t protocol)
 #endif
 
        bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
+#if defined(CONFIG_LWIP_LIB)
+       if (!ulwip_enabled() || !ulwip_in_loop())
+#endif
        net_init();
+
        if (eth_is_on_demand_init()) {
                eth_halt();
                eth_set_current();
@@ -649,6 +654,18 @@ restart:
                 */
                eth_rx();
 
+#if defined(CONFIG_LWIP_LIB)
+               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;
+                       }
+               }
+#endif
                /*
                 *      Abort if ctrl-c was pressed.
                 */
@@ -1213,6 +1230,13 @@ void net_process_received_packet(uchar *in_packet, int 
len)
        if (len < ETHER_HDR_SIZE)
                return;
 
+#if defined(CONFIG_LWIP_LIB)
+       if (ulwip_enabled()) {
+               uboot_lwip_poll();
+               return;
+       }
+#endif
+
 #if defined(CONFIG_API) || defined(CONFIG_EFI_LOADER)
        if (push_packet) {
                (*push_packet)(in_packet, len);
-- 
2.30.2

Reply via email to