[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