Re: [PATCH v5 00/20] Introduce the lwIP network stack

Tom Rini
2024-07-25T22:34:11Z

[-- Attachment #1: Type: text/plain, Size: 26831 bytes --]

On Thu, Jul 25, 2024 at 11:22:20AM -0600, Tom Rini wrote:
> On Thu, Jul 25, 2024 at 02:57:21PM +0200, Jerome Forissier wrote:
>
> > This is a rework of a patch series by Maxim Uvarov: "net/lwip: add lwip
> > library for the network stack" [1]. The goal is to introduce the lwIP TCP/IP
> > stack [2] [3] as an alternative to the current implementation in net/,
> > selectable with Kconfig, and ultimately keep only lwIP if possible. Some
> > reasons for doing so are:
> > - Make the support of HTTPS in the wget command easier. Javier T. and
> > Raymond M. (CC'd) have some additional lwIP and Mbed TLS patches to do
> > so. With that it becomes possible to fetch and launch a distro installer
> > such as Debian etc. using a secure, authenticated connection directly
> > from the U-Boot shell. Several use cases:
> > * Authentication: prevent MITM attack (third party replacing the
> > binary with a different one)
> > * Confidentiality: prevent third parties from grabbing a copy of the
> > image as it is being downloaded
> > * Allow connection to servers that do not support plain HTTP anymore
> > (this is becoming more and more common on the Internet these days)
> > - Possibly benefit from additional features implemented in lwIP
> > - Less code to maintain in U-Boot
> >
> > Prior to applying this series, the lwIP stack needs to be added as a
> > Git subtree with the following command:
> >
> > $ git subtree add --squash --prefix lib/lwip/lwip https://git.savannah.gnu.org/git/lwip.git STABLE-2_2_0_RELEASE
>
> This is better than v4, and on the hardware platforms I could build and
> boot on (which was most of mine except the am62x_beagleplay), the tests
> ran and completed, including the tftp+boot a Linux kernel.
>
> The bad news is CI blows up, a lot:
> https://source.denx.de/u-boot/u-boot/-/pipelines/21764
> And:
> https://dev.azure.com/u-boot/a1096300-2999-4ec4-a21a-4c22075e3771/_apis/build/builds/9014/logs/106
> which is another Kconfig dependency problem. I don't _think_ I
> introduced that, but since this wasn't against top of tree, I had to
> apply the cmd/Kconfig patch manually.
>
> I have my world build running still and may have more comments based on
> that.

First, with NET_LWIP being default rather than NET, there's a lot of
other Kconfig dependency issues. Unfortunately I don't see an easy tool
for making sure this is all clean aside from a shell loop like:
for C in `(cd configs;ls)`;do make -s $C;done

Once those are fixed, this is feeling pretty OK I think. I assume PXE
support is high on the follow-up TODO list? That said, after taking
tiger-rk3588 as an example platform and hacking out PXE related stuff and
turning on lwIP:
aarch64: (for 1/1 boards) all +10144.0 bss -4040.0 data -64.0 rodata -100.0 text +14348.0
tiger-rk3588 : all +10144 bss -4040 data -64 rodata -100 text +14348
u-boot: add: 161/-115, grow: 8/-6 bytes: 24552/-14382 (10170)
function old new delta
dhcp_recv - 1296 +1296
tftp_recv - 1152 +1152
ip4_input - 596 +596
new_netif - 556 +556
etharp_query - 552 +552
udp_input - 540 +540
etharp_input - 532 +532
distro_efi_read_bootflow_net - 516 +516
dhcp_loop - 512 +512
ip4addr_aton - 492 +492
static.dhcp_select - 484 +484
ip4_output_if_src - 436 +436
udp_sendto_if_src - 408 +408
static.dhcp_reboot - 400 +400
etharp_output - 400 +400
dhcp_create_msg - 384 +384
etharp_find_entry - 376 +376
dhcp_bind - 364 +364
send_request - 352 +352
dhcp_discover - 352 +352
raw_sendto_if_src - 328 +328
pbuf_copy_partial_pbuf - 328 +328
netif_add - 324 +324
do_tftpb 544 868 +324
pbuf_alloc - 308 +308
dhcp_release_and_stop - 308 +308
net_lwip_rx - 292 +292
raw_input - 288 +288
udp_bind - 284 +284
ethernet_input - 284 +284
etharp_raw - 284 +284
static.dhcp_handle_ack - 272 +272
ping_send - 248 +248
ip4addr_ntoa_r - 220 +220
inet_chksum_pseudo - 216 +216
ping_recv - 212 +212
etharp_output_to_arp_index - 208 +208
netif_set_addr - 204 +204
do_ping 124 328 +204
dhcp_start - 204 +204
send_data - 192 +192
dhcp_fine_tmr - 192 +192
pbuf_copy_partial - 184 +184
tftp_close - 176 +176
script_read_bootflow 420 596 +176
linkoutput - 176 +176
ethernet_output - 176 +176
tftp_write - 172 +172
pbuf_memcmp - 168 +168
static.send_error - 164 +164
netif_remove - 164 +164
raw_sendto - 160 +160
arp_table - 160 +160
tftp_init_common - 156 +156
pbuf_realloc - 152 +152
dhcp_inc_pcb_refcount - 152 +152
tftp_tmr - 148 +148
pbuf_free - 148 +148
udp_sendto - 144 +144
udp_connect - 144 +144
sys_timeout_abs - 140 +140
ip4_route - 136 +136
static.resend_data - 132 +132
pbuf_memfind - 128 +128
pbuf_add_header_impl - 128 +128
boot_file_name - 128 +128
static.netif_do_set_ipaddr - 124 +124
lwip_standard_chksum - 124 +124
sys_check_timeouts - 120 +120
tftp_error - 116 +116
etharp_free_entry - 116 +116
tftp_get - 112 +112
dhcp_run - 112 +112
static.send_ack - 108 +108
eth_start_udev - 104 +104
close_handle - 96 +96
sys_untimeout - 92 +92
ip4_addr_isbroadcast_u32 - 92 +92
init_packet - 92 +92
etharp_cleanup_netif - 92 +92
raw_new - 88 +88
pbuf_remove_header - 88 +88
net_lwip_get_netif - 88 +88
dhcp_option_trailer - 88 +88
udp_sendto_if - 84 +84
pbuf_alloc_reference - 84 +84
udp_remove - 80 +80
ip4_input_accept - 80 +80
netif_set_link_up - 76 +76
udp_netif_ip_addr_changed - 72 +72
raw_remove - 72 +72
raw_netif_ip_addr_changed - 72 +72
dhcp_option_long - 68 +68
dhcp_dec_pcb_refcount - 68 +68
udp_new - 64 +64
sys_timeout - 60 +60
pbuf_try_get_at - 60 +60
pbuf_clone - 60 +60
dhcp_network_changed_link_up - 60 +60
tftp_cleanup - 56 +56
pbuf_cat - 56 +56
netif_get_by_index - 56 +56
_u_boot_list_2_cmd_2_dhcp - 56 +56
tftp_state 4 56 +52
pbuf_skip_const - 48 +48
net_lwip_if_init - 48 +48
dhcp_supplied_address - 48 +48
netif_issue_reports - 44 +44
tftp_context - 40 +40
ip_data - 40 +40
etharp_request - 40 +40
raw_bind - 36 +36
net_lwip_remove_netif - 36 +36
memp_malloc - 36 +36
ip4_output_if - 36 +36
dhcp_option_short - 36 +36
call_lwip_dhcp_fine_tmr - 36 +36
netif_set_up - 32 +32
netif_set_down - 32 +32
inet_chksum - 32 +32
dhcp_set_state - 32 +32
dhcp_rx_options_val - 32 +32
pbuf_get_at - 28 +28
distro_efi_read_bootflow 60 88 +28
distro_efi_boot 360 388 +28
tftp_client_set_blksize - 24 +24
sys_now - 24 +24
pbuf_copy - 24 +24
pbuf_chain - 24 +24
memp_free - 24 +24
eth_bootdev_hunt 44 68 +24
do_dhcp - 24 +24
pbuf_ref - 20 +20
netif_input - 20 +20
do_net_stats 328 348 +20
static.str - 16 +16
ip4addr_ntoa - 16 +16
udp_recv - 12 +12
tftp_init_client - 12 +12
netif_set_default - 12 +12
udp_pcbs - 8 +8
tftp_read - 8 +8
tftp_open - 8 +8
raw_recv - 8 +8
raw_pcbs - 8 +8
pbuf_add_header - 8 +8
next_timeout - 8 +8
netif_null_output_ip4 - 8 +8
netif_list - 8 +8
netif_default - 8 +8
net_lwip_new_netif_noip - 8 +8
net_lwip_new_netif - 8 +8
lwip_htons - 8 +8
lwip_htonl - 8 +8
dhcp_rx_options_given - 8 +8
dhcp_pcb - 8 +8
udp_new_ip_type - 4 +4
static.xid - 4 +4
mem_trim - 4 +4
mem_malloc - 4 +4
mem_free - 4 +4
ip_chksum_pseudo - 4 +4
current_timeout_due_time - 4 +4
udp_port - 2 +2
ip_id - 2 +2
static.called - 1 +1
netif_num - 1 +1
etharp_cached_entry - 1 +1
dhcp_pcb_refcount - 1 +1
net_boot_file_name_explicit 1 - -1
tftp_windowsize 2 - -2
tftp_window_size_option 2 - -2
tftp_next_ack 2 - -2
tftp_last_nack 2 - -2
tftp_block_size_option 2 - -2
tftp_block_size 2 - -2
ping_seq_number 2 - -2
net_our_vlan 2 - -2
net_native_vlan 2 - -2
env_flags_vartype_rep 7 5 -2
timeout_count_max 4 - -4
timeout_count 4 - -4
tftp_timeout_count_max 4 - -4
tftp_remote_port 4 - -4
tftp_remote_ip 4 - -4
tftp_our_port 4 - -4
static.first_call 4 - -4
saved_tftp_block_size_option 4 - -4
net_try_count 4 - -4
net_state 4 - -4
net_server_ip 4 - -4
net_rx_packet_len 4 - -4
net_restarted 4 - -4
net_ping_ip 4 - -4
net_netmask 4 - -4
net_ip_id 4 - -4
net_ip 4 - -4
net_gateway 4 - -4
net_dns_server 4 - -4
net_dev_exists 4 - -4
net_boot_file_size 4 - -4
net_boot_file_expected_size_in_blocks 4 - -4
net_arp_wait_reply_ip 4 - -4
net_arp_wait_packet_ip 4 - -4
dummy_handler 4 - -4
arp_wait_tx_packet_size 4 - -4
arp_wait_try 4 - -4
net_server_ethaddr 6 - -6
net_ethaddr 6 - -6
udp_packet_handler 8 - -8
timeout_ms 8 - -8
time_handler 8 - -8
time_delta 8 - -8
tftp_prev_block 8 - -8
tftp_load_size 8 - -8
tftp_load_addr 8 - -8
tftp_cur_block 8 - -8
tftp_block_wrap_offset 8 - -8
tftp_block_wrap 8 - -8
net_tx_packet 8 - -8
net_rx_packet 8 - -8
arp_wait_timer_start 8 - -8
arp_wait_packet_ethaddr 8 - -8
arp_tx_packet 8 - -8
arp_packet_handler 8 - -8
net_get_arp_handler 12 - -12
default_filename 13 - -13
time_start 16 - -16
start_again_timeout_handler 16 - -16
_u_boot_list_2_env_clbk_2_vlan 16 - -16
_u_boot_list_2_env_clbk_2_serverip 16 - -16
_u_boot_list_2_env_clbk_2_nvlan 16 - -16
_u_boot_list_2_env_clbk_2_netmask 16 - -16
_u_boot_list_2_env_clbk_2_ipaddr 16 - -16
_u_boot_list_2_env_clbk_2_gatewayip 16 - -16
arp_is_waiting 20 - -20
net_set_udp_handler 24 - -24
ip_checksum_ok 28 - -28
ping_timeout_handler 32 - -32
net_clear_handlers 36 - -36
ip_to_string 36 - -36
is_serverip_in_cmd 40 - -40
net_send_udp_packet 44 - -44
net_get_async_tx_pkt_buf 44 - -44
eth_halt_state_only 44 - -44
on_vlan 48 - -48
on_serverip 48 - -48
on_nvlan 48 - -48
on_netmask 48 - -48
on_ipaddr 48 - -48
on_gatewayip 48 - -48
net_eth_hdr_size 56 - -56
arp_init 56 - -56
net_init_loop 60 - -60
eth_init 300 232 -68
env_flags_validate 644 576 -68
copy_filename 76 - -76
net_init 112 32 -80
string_to_vlan 84 - -84
net_set_timeout_handler 84 - -84
compute_ip_checksum 92 - -92
tftp_init_load_addr 100 - -100
skip_num 104 - -104
tftp_filename 128 - -128
arp_request 128 - -128
tftp_timeout_handler 132 - -132
lmb_get_free_size 136 - -136
net_set_udp_header 144 - -144
arp_timeout_check 148 - -148
net_update_ether 152 - -152
eth_validate_ethaddr_str 152 - -152
string_to_ip 156 - -156
net_parse_bootfile 160 - -160
net_set_ether 180 - -180
net_set_ip_header 184 - -184
arp_raw_request 228 - -228
ping_start 276 - -276
net_send_ip_packet 292 - -292
net_check_prereq 308 - -308
ping_receive 332 - -332
net_start_again 336 - -336
net_loop 544 - -544
arp_receive 560 - -560
tftp_send 584 - -584
net_process_received_packet 764 4 -760
tftp_start 908 - -908
net_boot_file_name 1024 - -1024
tftp_handler 1308 - -1308
net_pkt_buf 7744 6208 -1536
arp_tx_packet_buf 1600 - -1600

Although I'm not 100% sure that config is functionally equivalent, so
perhaps it would be helpful if you could take a board or two and
reconfigure them with the legacy stack, but equivalent functionality to
with lwIP, for comparison sake? Thanks!

--
Tom

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 659 bytes --]