[lwip-devel] [RFC PATCH 0/5] LWIP stack integration

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jun 8 19:52:55 CEST 2023


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.

Can you tidy up the series and include DHCP and PXE done through LWIP?

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