[lwip-devel] [RFC PATCH 0/5] LWIP stack integration
Peter Robinson
pbrobinson at gmail.com
Fri Jun 9 09:37:24 CEST 2023
On Thu, Jun 8, 2023 at 6:56 PM Ilias Apalodimas
<ilias.apalodimas at linaro.org> wrote:
>
> Thanks Maxim,
>
> On Thu, 8 Jun 2023 at 13:14, Maxim Uvarov <maxim.uvarov at linaro.org> wrote:
> >
> > Ilias asked to make more clear results to compare the original stack and LWIP stack. So the difference between the current U-boot stack and the LWIP stack with 3 network commands is:
> > a) 18Kb - ls -lh size
> > b) 15Kb - bloat-o-meter script total line report.
> >
> > BOM=linux/scripts/bloat-o-meter (script)
> >
> > 1. 893K - U-boot CMD_NET=n
> > 2. 928K - U-boot CMD_NET=y TFTP=y PING=y WGET=y
> > BOM 1-2: Total: Before=692286, After=722283, chg +4.33%
> > 3. 940K - U-boot CMD_NET=n, LWIP_TFTP=y LWIP_PING=y LWIP_PING=y
> > BOM 1-3: Total: Before=692286, After=738425, chg +6.66%
>
> That's much more readable! I discussed this with Tom over IRC and the
> size difference is certainly a reasonable trade-off for the extra
> functionality.
Yes, this looks great! I'm also sure with a closer look there could be
further optimisations here in time as well. I feel having a widely
used IP stack that's also widely audited is a big win here, it will
also provide things like HTTP, DNS and IPv6 without having to reinvent
the wheel.
> Can you tidy up the series and include DHCP and PXE done through LWIP?
I'll look forward to this.
> Thanks
> /Ilias
> >
> > BOM 2-3:
> >
> > add/remove: 287/203 grow/shrink: 3/11 up/down: 43459/-27317 (16142)
> > Function old new delta
> > tcp_input - 3588 +3588
> > tcp_receive - 2884 +2884
> > ip4_reass - 1760 +1760
> > tcp_output - 1400 +1400
> > tcp_write - 1300 +1300
> > tcp_slowtmr - 1172 +1172
> > httpc_tcp_recv - 1044 +1044
> > tftp_recv - 888 +888
> > ip4_input - 700 +700
> > ip4_frag - 632 +632
> > icmp_input - 604 +604
> > udp_input - 596 +596
> > etharp_input - 512 +512
> > tcp_split_unsent_seg - 500 +500
> > ip4addr_aton - 492 +492
> > tcp_alloc - 484 +484
> > ip4_output_if_src - 476 +476
> > tcp_close_shutdown - 448 +448
> > etharp_query - 436 +436
> > httpc_init_connection_common.constprop - 416 +416
> > udp_sendto_if_src - 408 +408
> > etharp_output - 404 +404
> > arp_table - 400 +400
> > tcp_connect - 396 +396
> > pbuf_alloc - 376 +376
> > etharp_find_entry - 372 +372
> > tcp_abandon - 368 +368
> > tcp_zero_window_probe - 356 +356
> > raw_sendto_if_src - 328 +328
> > pbuf_copy_partial_pbuf - 328 +328
> > ip_reass_free_complete_datagram - 328 +328
> > tcp_create_segment - 300 +300
> > raw_input - 292 +292
> > uboot_lwip_init - 284 +284
> > ethernet_input - 284 +284
> > etharp_raw - 284 +284
> > tcp_output_alloc_header_common.constprop - 280 +280
> > cmds - 280 +280
> > udp_bind - 276 +276
> > tcp_oos_insert_segment - 276 +276
> > ip_reass_remove_oldest_datagram - 272 +272
> > icmp_send_response - 268 +268
> > netif_add - 260 +260
> > ping_send - 244 +244
> > tcp_rexmit - 232 +232
> > tcp_parseopt - 220 +220
> > tcp_free_acked_segments.constprop - 220 +220
> > send_request - 220 +220
> > inet_chksum_pseudo - 216 +216
> > ip4addr_ntoa_r - 212 +212
> > do_lwip_ping - 212 +212
> > tcp_enqueue_flags - 208 +208
> > etharp_output_to_arp_index - 208 +208
> > netif_set_addr - 204 +204
> > tcp_fasttmr - 200 +200
> > tcp_rexmit_rto_prepare - 196 +196
> > tcp_process_refused_data - 196 +196
> > send_data - 196 +196
> > lwip_wget - 192 +192
> > ethernet_output - 192 +192
> > ping_recv - 188 +188
> > pbuf_memcmp - 184 +184
> > pbuf_copy_partial - 184 +184
> > httpc_free_state - 180 +180
> > tcp_send_fin - 172 +172
> > httpc_recv - 168 +168
> > tcp_output_control_segment_netif - 164 +164
> > send_error.isra - 164 +164
> > do_ops - 164 +164
> > raw_sendto - 160 +160
> > pbuf_realloc - 160 +160
> > pbuf_free - 160 +160
> > do_lwip_wget - 160 +160
> > do_lwip_tftp - 160 +160
> > tftp_init_common - 156 +156
> > tcp_rst_netif - 152 +152
> > udp_sendto - 144 +144
> > tftp_tmr - 144 +144
> > tcp_rst - 144 +144
> > uboot_lwip_if_init - 140 +140
> > tcp_pcb_remove - 140 +140
> > tcp_pbuf_prealloc - 140 +140
> > sys_timeout_abs - 140 +140
> > lwip_tftp - 140 +140
> > netif_do_set_ipaddr.isra - 136 +136
> > ip4_route - 136 +136
> > tcp_netif_ip_addr_changed - 132 +132
> > resend_data.isra - 132 +132
> > inet_chksum_pbuf - 132 +132
> > tcp_output_control_segment - 128 +128
> > pbuf_memfind - 128 +128
> > lwip_standard_chksum - 128 +128
> > tcp_rexmit_fast - 124 +124
> > tcp_new_port - 124 +124
> > tcp_close_shutdown_fin - 124 +124
> > pbuf_add_header_impl - 124 +124
> > tcp_send_empty_ack - 120 +120
> > httpc_create_request_string.constprop.isra - 120 +120
> > tftp_get - 116 +116
> > tcp_recved - 116 +116
> > tcp_pcb_purge - 116 +116
> > tftp_write - 112 +112
> > pbuf_free_header - 112 +112
> > httpc_tcp_connected - 112 +112
> > tftp_error - 108 +108
> > send_ack.isra - 108 +108
> > low_level_input.constprop - 108 +108
> > tcp_input_delayed_close - 104 +104
> > close_handle - 100 +100
> > sys_untimeout - 96 +96
> > memp_pools - 96 +96
> > tcp_keepalive - 92 +92
> > ip4_addr_isbroadcast_u32 - 92 +92
> > init_packet - 92 +92
> > tcp_kill_state - 88 +88
> > raw_new - 88 +88
> > ping_raw_init - 88 +88
> > lwip_ping_init - 88 +88
> > udp_sendto_if - 84 +84
> > tcp_update_rcv_ann_wnd - 84 +84
> > tcp_recv_null - 84 +84
> > pbuf_remove_header - 84 +84
> > pbuf_alloc_reference - 84 +84
> > udp_remove - 80 +80
> > tcp_get_next_optbyte - 80 +80
> > pbuf_alloced_custom - 80 +80
> > ip4_input_accept - 80 +80
> > httpc_close - 80 +80
> > etharp_free_entry - 80 +80
> > uboot_lwip_poll - 76 +76
> > tcpip_tcp_timer - 76 +76
> > udp_netif_ip_addr_changed - 72 +72
> > uboot_netif - 72 +72
> > tcp_output_alloc_header.constprop - 72 +72
> > raw_netif_ip_addr_changed - 72 +72
> > tcpip_try_callback - 68 +68
> > tcp_timer_needed - 68 +68
> > tcp_seg_copy - 68 +68
> > tcp_netif_ip_addr_changed_pcblist - 68 +68
> > ping_timeout - 68 +68
> > ethernetif_input - 68 +68
> > udp_new - 64 +64
> > pbuf_try_get_at - 64 +64
> > sys_timeout - 60 +60
> > pbuf_clone - 60 +60
> > tcp_seg_free - 56 +56
> > pbuf_cat - 56 +56
> > netif_get_by_index - 56 +56
> > low_level_output - 56 +56
> > _u_boot_list_2_cmd_2_lwipinfo - 56 +56
> > _u_boot_list_2_cmd_2_lwip - 56 +56
> > tftp_state 4 56 +52
> > tcp_tmr - 52 +52
> > tcp_rexmit_rto - 52 +52
> > tcp_segs_free - 48 +48
> > tcp_eff_send_mss_netif - 48 +48
> > pbuf_skip_const - 48 +48
> > ipfrag_free_pbuf_custom - 48 +48
> > httpc_tcp_poll - 48 +48
> > tcp_free_ooseq - 44 +44
> > tcp_close - 44 +44
> > pbuf_free_ooseq_callback - 44 +44
> > netif_issue_reports - 44 +44
> > ip_reass_dequeue_datagram - 44 +44
> > httpc_get_internal_addr - 44 +44
> > tftp_read - 40 +40
> > tftp - 40 +40
> > ip_data - 40 +40
> > etharp_request - 40 +40
> > do_lwip_info - 40 +40
> > ulwip_timeout_handler - 36 +36
> > raw_bind - 36 +36
> > memp_malloc - 36 +36
> > ip4_output_if - 36 +36
> > tcp_pcb_lists - 32 +32
> > pbuf_header_force - 32 +32
> > pbuf_clen - 32 +32
> > netif_set_up - 32 +32
> > netif_set_link_up - 32 +32
> > inseg - 32 +32
> > inet_chksum - 32 +32
> > tcp_next_iss - 28 +28
> > pbuf_get_at - 28 +28
> > httpc_tcp_err - 28 +28
> > do_lwip_init - 28 +28
> > tcp_rexmit_rto_commit - 24 +24
> > sys_now - 24 +24
> > settings - 24 +24
> > pbuf_copy - 24 +24
> > pbuf_chain - 24 +24
> > memp_free - 24 +24
> > __func__ 1243 1266 +23
> > ulwip_exit - 20 +20
> > tcp_trigger_input_pcb_close - 20 +20
> > tcp_poll - 20 +20
> > ping_send_now - 20 +20
> > pbuf_ref - 20 +20
> > str - 16 +16
> > ip4addr_ntoa - 16 +16
> > daddr - 16 +16
> > tcp_backoff - 13 +13
> > ulwip_loop_set - 12 +12
> > ulwip_in_loop - 12 +12
> > ulwip_enabled - 12 +12
> > ulwip_app_get_err - 12 +12
> > udp_recv - 12 +12
> > tftp_init_client - 12 +12
> > tcp_sent - 12 +12
> > tcp_recv - 12 +12
> > tcp_free - 12 +12
> > tcp_err - 12 +12
> > tcp_arg - 12 +12
> > net_process_received_packet 800 812 +12
> > icmp_time_exceeded - 12 +12
> > icmp_dest_unreach - 12 +12
> > udp_pcbs - 8 +8
> > tftp_open - 8 +8
> > tftp_close - 8 +8
> > tcphdr_opt2 - 8 +8
> > tcphdr - 8 +8
> > tcp_tw_pcbs - 8 +8
> > tcp_new - 8 +8
> > tcp_listen_pcbs - 8 +8
> > tcp_input_pcb - 8 +8
> > tcp_bound_pcbs - 8 +8
> > tcp_active_pcbs - 8 +8
> > tcp_abort - 8 +8
> > recv_data - 8 +8
> > reassdatagrams - 8 +8
> > raw_recv - 8 +8
> > raw_pcbs - 8 +8
> > ping_target - 8 +8
> > ping_pcb - 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
> > lwip_htons - 8 +8
> > lwip_htonl - 8 +8
> > httpc_tcp_sent - 8 +8
> > tcp_persist_backoff - 7 +7
> > ethzero - 6 +6
> > ethbroadcast - 6 +6
> > ulwip_app_err - 4 +4
> > udp_new_ip_type - 4 +4
> > uboot_net_use_lwip - 4 +4
> > tcpip_tcp_timer_active - 4 +4
> > tcp_ticks - 4 +4
> > seqno - 4 +4
> > mem_trim - 4 +4
> > mem_malloc - 4 +4
> > mem_free - 4 +4
> > loop_lwip - 4 +4
> > iss - 4 +4
> > ip_target - 4 +4
> > ip_chksum_pseudo - 4 +4
> > ip_addr_any - 4 +4
> > httpc_init_connection - 4 +4
> > ackno - 4 +4
> > udp_port - 2 +2
> > tcplen - 2 +2
> > tcphdr_optlen - 2 +2
> > tcphdr_opt1len - 2 +2
> > tcp_port - 2 +2
> > tcp_optidx - 2 +2
> > recv_acked - 2 +2
> > ping_seq_num - 2 +2
> > memp_UDP_PCB - 2 +2
> > memp_TCP_SEG - 2 +2
> > memp_TCP_PCB_LISTEN - 2 +2
> > memp_TCP_PCB - 2 +2
> > memp_TCPIP_MSG_INPKT - 2 +2
> > memp_TCPIP_MSG_API - 2 +2
> > memp_SYS_TIMEOUT - 2 +2
> > memp_REASSDATA - 2 +2
> > memp_RAW_PCB - 2 +2
> > memp_PBUF_POOL - 2 +2
> > memp_PBUF - 2 +2
> > memp_FRAG_PBUF - 2 +2
> > ip_reass_pbufcount - 2 +2
> > ip_id - 2 +2
> > tcp_timer_ctr - 1 +1
> > tcp_timer - 1 +1
> > tcp_active_pcbs_changed - 1 +1
> > recv_flags - 1 +1
> > pbuf_free_ooseq_pending - 1 +1
> > netif_num - 1 +1
> > flags - 1 +1
> > etharp_cached_entry - 1 +1
> > supported_nfs_versions 1 - -1
> > retry_action 1 - -1
> > net_boot_file_name_explicit 1 - -1
> > dhcp_option_overload 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
> > last_op 2 - -2
> > env_flags_vartype_rep 7 5 -2
> > linefeed 3 - -3
> > wget_timeout_count 4 - -4
> > wget_loop_state 4 - -4
> > web_server_ip 4 - -4
> > 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
> > saved_tftp_block_size_option 4 - -4
> > retry_tcp_seq_num 4 - -4
> > retry_tcp_ack_num 4 - -4
> > retry_len 4 - -4
> > pkt_q_idx 4 - -4
> > packets 4 - -4
> > our_port 4 - -4
> > nfs_timeout_count 4 - -4
> > nfs_state 4 - -4
> > nfs_server_port 4 - -4
> > nfs_server_mount_port 4 - -4
> > nfs_server_ip 4 - -4
> > nfs_our_port 4 - -4
> > nfs_offset 4 - -4
> > nfs_len 4 - -4
> > nfs_download_state 4 - -4
> > net_ping_ip 4 - -4
> > net_dns_server 4 - -4
> > net_boot_file_expected_size_in_blocks 4 - -4
> > last_reg_lo 4 - -4
> > last_reg_hi 4 - -4
> > last_mask 4 - -4
> > last_data 4 - -4
> > last_addr_lo 4 - -4
> > last_addr_hi 4 - -4
> > initial_data_seq_num 4 - -4
> > http_ok 4 - -4
> > fs_mounted 4 - -4
> > filefh3_length 4 - -4
> > eth_common_init 4 - -4
> > dummy_handler 8 4 -4
> > dhcp_state 4 - -4
> > dhcp_server_ip 4 - -4
> > dhcp_leasetime 4 - -4
> > current_wget_state 4 - -4
> > bootp_try 4 - -4
> > bootp_num_ids 4 - -4
> > http_eom 5 - -5
> > bootfile1 5 - -5
> > timeout_ms 8 - -8
> > time_taken_max 8 - -8
> > time_start 16 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
> > rpc_id 8 - -8
> > nfs_path 8 - -8
> > nfs_filename 8 - -8
> > miiphy_is_1000base_x 8 - -8
> > init_sequence_r 264 256 -8
> > image_url 8 - -8
> > distro_pxe_check 8 - -8
> > current_mii 8 - -8
> > content_length 8 - -8
> > bootp_timeout 8 - -8
> > bootp_start 8 - -8
> > tcp_get_tcp_state 12 - -12
> > do_wget 12 - -12
> > do_tftpb 12 - -12
> > do_nfs 12 - -12
> > do_dhcp 12 - -12
> > do_bootp 12 - -12
> > default_filename 13 - -13
> > bootfile3 14 - -14
> > content_len 15 - -15
> > reg_2_desc_tbl 16 - -16
> > pkt_q 16 - -16
> > mii_devs 16 - -16
> > bootp_ids 16 - -16
> > miiphy_get_current_dev 20 - -20
> > tcp_set_tcp_handler 24 - -24
> > pxe_default_paths 24 - -24
> > net_set_udp_handler 24 - -24
> > net_check_prereq 256 232 -24
> > miiphy_init 28 - -28
> > ping_timeout_handler 32 - -32
> > net_nis_domain 32 - -32
> > net_hostname 32 - -32
> > distro_bootmeth_pxe_ids 32 - -32
> > dirfh 32 - -32
> > initr_net 36 - -36
> > distro_bootmeth_pxe_bind 36 - -36
> > ip_to_string 40 - -40
> > distro_bootmeth_pxe_ops 40 - -40
> > net_send_udp_packet 44 - -44
> > label_boot 1944 1900 -44
> > env_flags_validate 632 588 -44
> > reg_3_desc_tbl 48 - -48
> > do_get_tftp 56 - -56
> > cmd_net 56 - -56
> > _u_boot_list_2_cmd_2_wget 56 - -56
> > _u_boot_list_2_cmd_2_tftpboot 56 - -56
> > _u_boot_list_2_cmd_2_pxe 56 - -56
> > _u_boot_list_2_cmd_2_ping 56 - -56
> > _u_boot_list_2_cmd_2_nfs 56 - -56
> > _u_boot_list_2_cmd_2_net 56 - -56
> > _u_boot_list_2_cmd_2_mii 56 - -56
> > _u_boot_list_2_cmd_2_dhcp 56 - -56
> > _u_boot_list_2_cmd_2_bootp 56 - -56
> > net_loop 652 592 -60
> > net_eth_hdr_size 60 - -60
> > bootp_reset 60 - -60
> > net_root_path 64 - -64
> > filefh 64 - -64
> > do_bootvx 816 748 -68
> > miiphy_set_current_dev 72 - -72
> > basename 72 - -72
> > pxe_get_file_size 76 - -76
> > copy_filename 76 - -76
> > distro_pxe_getfile 80 - -80
> > tftp_init_load_addr 92 - -92
> > miiphy_read 92 - -92
> > extract_range 92 - -92
> > miiphy_write 96 - -96
> > miiphy_get_active_dev 96 - -96
> > distro_pxe_read_file 96 - -96
> > wget_fail 104 - -104
> > skip_num 104 - -104
> > miiphy_get_dev_by_name 104 - -104
> > dump_field 104 - -104
> > do_bdinfo 432 328 -104
> > bootp_timeout_handler 104 - -104
> > nfs_timeout_handler 108 - -108
> > cmd_pxe_sub 112 - -112
> > nfs_umountall_req 120 - -120
> > _u_boot_list_2_driver_2_bootmeth_pxe 120 - -120
> > do_ping 124 - -124
> > tftp_filename 128 - -128
> > reg_9_desc_tbl 128 - -128
> > reg_10_desc_tbl 128 - -128
> > distro_pxe_boot 128 - -128
> > tftp_timeout_handler 132 - -132
> > do_pxe 132 - -132
> > nfs_umountall_reply 136 - -136
> > lmb_get_free_size 136 - -136
> > format_mac_pxe 136 - -136
> > miiphy_listdev 144 - -144
> > efi_net_set_dhcp_ack 144 - -144
> > wget_timeout_handler 148 - -148
> > nfs_mount_reply 148 - -148
> > dhcp_packet_process_options 148 - -148
> > eth_validate_ethaddr_str 152 - -152
> > do_pxe_get 156 - -156
> > reg_0_desc_tbl 160 - -160
> > net_parse_bootfile 160 - -160
> > miiphy_info 160 - -160
> > get_pxelinux_path 160 - -160
> > do_net 164 - -164
> > net_auto_load 172 - -172
> > do_net_list 176 - -176
> > rpc_lookup_reply 180 - -180
> > nfs_readlink_req 184 - -184
> > nfs_mount_req 188 - -188
> > reg_5_desc_tbl 192 - -192
> > reg_4_desc_tbl 192 - -192
> > miiphy_speed 200 - -200
> > miiphy_duplex 200 - -200
> > nfs_read_req 224 - -224
> > do_pxe_boot 248 - -248
> > reg_1_desc_tbl 256 - -256
> > mii_reg_desc_tbl 256 - -256
> > nfs_send 260 - -260
> > wget_start 268 - -268
> > ping_start 276 - -276
> > nfs_lookup_reply 280 - -280
> > rpc_req 300 - -300
> > eth_initialize 300 - -300
> > distro_pxe_read_bootflow 300 - -300
> > nfs_readlink_reply 328 - -328
> > nfs_lookup_req 328 - -328
> > ping_receive 332 - -332
> > pxe_get 376 - -376
> > nfs_read_reply 396 - -396
> > wget_send_stored 444 - -444
> > nfs_start 468 - -468
> > dhcp_process_options 508 - -508
> > tftp_send 560 - -560
> > nfs_handler 580 - -580
> > bootp_request 612 - -612
> > dhcp_extended 616 - -616
> > netboot_common 632 - -632
> > default_environment 4444 3800 -644
> > tftp_start 912 - -912
> > dhcp_handler 1000 - -1000
> > wget_handler 1092 - -1092
> > tftp_handler 1304 - -1304
> > nfs_path_buff 2048 - -2048
> > do_mii 2124 - -2124
> > Total: Before=722283, After=738425, chg +2.23%
> >
> >
> >
> > On Thu, 8 Jun 2023 at 02:07, Tom Rini <trini at konsulko.com> wrote:
> >>
> >> On Wed, May 24, 2023 at 10:18:13PM +0200, Simon Goldschmidt wrote:
> >> > Hi Maxim, Tom,
> >> >
> >> > On 24.05.2023 16:05, Maxim Uvarov wrote:
> >> > > On Tue, 23 May 2023 at 03:23, Tom Rini <trini at konsulko.com> wrote:
> >> > >
> >> > > > On Mon, May 22, 2023 at 12:40:49PM -0400, Maxim Uvarov wrote:
> >> > > > > On Mon, 22 May 2023 at 10:20, Tom Rini <trini at konsulko.com> wrote:
> >> > > > >
> >> > > > > > On Mon, May 22, 2023 at 04:33:57PM +0300, Ilias Apalodimas wrote:
> >> > > > > > > Hi Maxim
> >> > > > > > >
> >> > > > > > > On Mon, 22 May 2023 at 12:01, Maxim Uvarov <maxim.uvarov at linaro.org>
> >> > > > > > wrote:
> >> > > > > > > >
> >> > > > > > > > My measurements for binary after LTO looks like:
> >> > > > > > > >
> >> > > > > > > > U-boot WGET | LWIP WGET + ping | LWIP WGET| diff bytes| diff %
> >> > > > > > > > 870728 | 915000 | 912560 |
> >> > > > > > 41832 | 4.8
> >> > > > > > >
> >> > > > > > >
> >> > > > > > > I think you'll need to analyze that a bit more. First of all I don't
> >> > > > > > > think the '+ping' tab is useful. What is is trying to achieve?
> >> > > > > >
> >> > > > >
> >> > > > > To show the difference of extra bytes if we add a ping app on top.
> >> > > > >
> >> > > > >
> >> > > > > > > - How was LWIP compiled?
> >> > > > > >
> >> > > > >
> >> > > > > It has a really huge configuration. I tried to turn off everything off
> >> > > > > everything what can impact on size but still make http app work:
> >> > > > > #define LWIP_HAVE_LOOPIF 0
> >> > > > > #define LWIP_NETCONN 0
> >> > > > > #define LWIP_SOCKET 0
> >> > > > > #define SO_REUSE 0
> >> > > > > #define LWIP_STATS 0
> >> > > > > #define PPP_SUPPORT 0
> >> > > > >
> >> > > > > Disabling loopback:
> >> > > > > #define LWIP_NETIF_LOOPBACK 0
> >> > > > > can lower to 912288 bytes.
> >> > > > >
> >> > > > > And it's the same compilation option (optimization for size) as the main
> >> > > > > u-boot. I will do more experiments, but I think the goal is not to turn
> >> > > > off
> >> > > > > everything.
> >> > > > >
> >> > > > >
> >> > > > > > > - Was ipv6 supported?
> >> > > > > >
> >> > > > >
> >> > > > > No. I.e. when I sent results it was enabled on the compilation stage but
> >> > > > > not used. I just checked that size remains the same if IPv6 is not even
> >> > > > > compiled.
> >> > > > >
> >> > > > >
> >> > > > > > > - Can we strip it down even further?
> >> > > > > > >
> >> > > > > >
> >> > > > >
> >> > > > > There is always room for optimization. I think I tried to turn off
> >> > > > > everything that is configurable with defines. I can play with disable IP
> >> > > > > reassembly and things like that or figure out which functions have more
> >> > > > > size and if it's possible to exclude them.
> >> > > > >
> >> > > > >
> >> > > > > > > In general please give as much information as you can with what we
> >> > > > > > > gain in functionality from LWIP with those extra bytes of code.
> >> > > > > >
> >> > > > > >
> >> > > > > The main idea is to reuse a maintainable IP stack outside of U-boot.
> >> > > > LWIP
> >> > > > > can give a nice separation between IP stack code and network application
> >> > > > > code. I.e. application should not take care about any TCP details (SYN,
> >> > > > > ACK, retransmission, reassembly etc) and should open connection and use
> >> > > > > functions similar to recv() and send() to transfer data. Data means
> >> > > > > application data, no network packets. And LWIP allows
> >> > > > > us to do that.
> >> > > > > Because LWIP has an API similar to sockets, it has to be very easy to
> >> > > > port
> >> > > > > a linux application to LWIP. Then you can test it with a tap device. Then
> >> > > > > copy sources to U-boot, add a small integration layer (cmd command to
> >> > > > > call), compile and use.
> >> > > > >
> >> > > > > So my suggestion was:
> >> > > > > - do not maintain new network stack code in the current U-boot. Use lwip
> >> > > > > sources as an external project. All bugs related to network stack go to
> >> > > > > lwip project first, then sync with U-boot.
> >> > > > > - maintain network apps code* or
> >> > > > > -- inside U-boot. Write our own code for application and maintain it
> >> > > > > inside U-boot.
> >> > > > > -- inside LWIP. Add examples to LWIP which are suitable for both
> >> > > > U-boot
> >> > > > > and LWIP.
> >> > > > >
> >> > > > > * Let's define a U-boot network application as a cmd command. It might be
> >> > > > > ping, wget (http or https download), telnet, arp dns etc..
> >> > > > >
> >> > > > > Let's consider the real use case, like HTTPS download client. We need to
> >> > > > > enable TLS connection, validate certificates, then do http download.
> >> > > > > Looking at the current code of wget command it's quite difficult to
> >> > > > > implement this due to the application having some protol level things. On
> >> > > > > the other side we can find embedTLS examples to do https download on
> >> > > > > sockets. If LWIP socket API is ported then the only thing you need to do
> >> > > > is
> >> > > > > change socket() -> lwip_socket(), recv()->lwip_recv(),
> >> > > > send()->lwip_send()
> >> > > > > and etc, even function names are similar. If LWIP socket API is not
> >> > > > > supported, then use callback API for recv() and send(), which are also
> >> > > > > easy.
> >> > > > >
> >> > > > > So yes we add extra bytes, but that will allow us to write more complex
> >> > > > > apps, use standard debug tools, use applications with very minimal
> >> > > > > integration changes, use help from the LWIP community to fix protocol
> >> > > > bugs,
> >> > > > > etc..
> >> > > > > Bunch of things already implemented there:
> >> > > > > - ipv6
> >> > > > > - dhcp
> >> > > > > - snmp
> >> > > > > - igmp
> >> > > > > - dns
> >> > > > > - tcp and udp and raw.
> >> > > > > - loopback
> >> > > > > - netconn
> >> > > > > - socket
> >> > > > > - stats
> >> > > > > - ppp
> >> > > > > (I just followed configurable defines).
> >> > > > >
> >> > > > >
> >> > > > > And please make sure to disable the previous support, my guess fro that
> >> > > > > > much growth is that you didn't.
> >> > > > > >
> >> > > > >
> >> > > > > # CONFIG_PROT_TCP is not set
> >> > > > > # CONFIG_PROT_UDP is not set
> >> > > > > # CONFIG_UDP_CHECKSUM is not set
> >> > > > > # CONFIG_UDP_FUNCTION_FASTBOOT is not set
> >> > > > > # CONFIG_CMD_WGET is not set
> >> > > >
> >> > > > I think you need to step back and figure out a better way to measure the
> >> > > > size change and growth.
> >> > > >
> >> > > > I am not interested in a path that long term means two networking stacks
> >> > > > in U-Boot.
> >> > > >
> >> > > > I am not interested in massively growing the overall binary size for
> >> > > > every platform. Given how much larger just TCP support is, that's
> >> > > > strongly implying a huge growth for the older use cases too.
> >> > > >
> >> > > > But I also suspect given the overall reputation that LWIP enjoys,
> >> > > > there's something amiss here.
> >> > > >
> >> > > > --
> >> > > > Tom
> >> > > >
> >> > >
> >> > > +cc lwip-devel@ mailing list, maybe they have something to add.
> >> >
> >> > I do think using lwIP instead of "inventing yet another IP stack" is a
> >> > good idea! However, in terms of code size, lwIP will lose against what's
> >> > in U-Boot at present. And this is only natural, as lwIP is a "full-size"
> >> > stack supporting multiple concurrently running applications while the
> >> > current IP stack in U-Boot is rather "crippled" down to just what the
> >> > implementor needed at the time of writing.
> >> >
> >> > One example of this is that (if I remember correctly), U-Boot only has
> >> > one single network packet buffer, while lwIP has support for multiple
> >> > buffers. When speaking of TCP (forgive me if I'm wrong, I've lost track
> >> > of that development in U-Boot about 3 years ago), we're comparing "we
> >> > have implemented everything we need so that it just kind of works" to
> >> > "we can easily add a HTTPS client to download something over the
> >> > internet just by enabling more compile options".
> >> >
> >> > Also, when comparing lwIP to U-Boot TCP code size, keep in mind that
> >> > U-Boot TCP (at least that of some years ago) is far from complete when
> >> > compared to lwIP!
> >> >
> >> > lwIP is meant to be highly configurable and we're always open to add yet
> >> > more options to leave out more code when it's not needed. However, I
> >> > think there are some design decisions that will make lwIP larger than
> >> > the current IP stack in U-Boot. To me, that's a natural result of having
> >> > a "generic code" approach vs "developed to our needs". However, while
> >> > DHCP + BOOTP and even a simple network console was rather easy to
> >> > implement, I would not recommend implementing your own HTTPS download
> >> > but rather using the existing lwIP + apps for that.
> >> >
> >> > In the end, I cannot take the decision from you. In my opinion, lwIP
> >> > would be the better decision in terms of future work load and
> >> > compatibility, but in the short run, it *will* lead to bigger binaries
> >> > at least in some setups. And I do know from my past that it sometimes
> >> > has been a pain to try and stuff a new U-Boot release into the existing
> >> > space of flash or RAM, so that's not an easy decision.
> >> >
> >> > If you do take the lwIP approach however, let us know if we can help!
> >>
> >> Given Maxim's more recent experiments, I'm sure we can come up with
> >> something that works overall. There's hopefully a place or two U-Boot
> >> people can help introduce a tunable or two to lwIP to bring some sizes
> >> down. But I think it's overall looking to be the right direction.
> >>
> >> --
> >> Tom
More information about the U-Boot
mailing list