
Legacy TCP stack is bad. Here are some of the known issues: * tcp packet from other connection can break a current one * tcp send sequence always starts from zero * bad tcp options processing * strange assumptions on packet size for selective acknowledge * tcp interface assumes one of the two scenarios: - data downloading from remote host to a board - request-response exchange with a small packets so it's not possible to upload large amount of data from the board to remote host. * wget test generate bad tcp stream, test should fail but it passes instead
This series of patches fixes all of the above issues.
The benefits: * A lot of bug was fixed * Better and more reliable TCP state machine * Tcp clients becomes smaller/simpler * Data uploading was fixed (now it's possible to transmit a huge amount of data from the board to remote host) * Netcat over tcp was implemented. Netcat supports data downloading/uploading from/to remote host in client/server mode. * An example web-server implementation. This code can be used as a base for web-based firmware uploading used by some vendors.
Modification was verified with * firmware downloading via u-boot wget command * fastboot over tcp * netcat linux client * Firefox/Chrome/Edge using example web-server implementation
Changes v2: * cover letter was added * some patches were removed
Changes v3: * better cover letter
Changes v4: * fix bug in debug output * add more comments * code style fixes
Changes v5: * old patches were occasionally sent with v4 * add back web-server patches * fix bug in debug output * add more comments * code style fixes
Changes v6: * fix the wget test * improve description of "simplify tcp header filling code" patch
Changes v7: * fix include ordering * improve option descriptions * fix a lot of extra brackets and comparisons against NULL / 0 * add empty lines before final returns * fixed a bug with zero size httpd uploads
Changes v8: * [tcp] add function to restart rx inactivity timeout. This may help in the cases where remote peer waits for u-boot data, but u-boot is busy with long executing action * [httpd] add function returning underlying tcp stream from request id. This (with the above change) allows avoid connection break for the long processing post requests.
Changes v9: * rebase all changes on top of origin/next * update test/cmd/wget patch description (bad tcp ack/seq issue was already fixed in origin/next) * tcp: add rx/tx packet counters to a tcp_stream structure * wget: use tcp rx packet counter instead of own one * netcat: use tcp rx/tx packet counters instead of own one
Changes v10: * netcat: fix bug appeared after rx/tx packet counter addition * rebased on top of v2024.10
Changes v11: * fix spelling in cover letter
Changes v12: * rebase on top of master branch (3df6145db0e) * slightly change tcp->rx() & tcp->tx() callback declarations, this allow us to terminate a connection if something goes wrong in rx/tx paths. * set net_boot_file_size variable in httpd_upload * set filesize env variable to a proper value netcat and httpd_upload
Mikhail Kshevetskiy (13): net/tcp: fix TCP options processing net/tcp: fix selective acknowledge net/tcp: put connection specific data into a tcp_stream structure net/tcp: add connection info to tcp_stream structure net/tcp: rename ack_edge and seq_init to more common rcv_nxt and irs net/tcp: improve tcp framework, use better state machine test/cmd/wget: fix the test net/tcp: simplify tcp header filling code net/tcp: define a fallback value for rcv_wnd size net/net: fix include ordering net/netcat: add netcat over tcp support net/httpd: add httpd common code net/httpd-upload: an example web-server implementation for file uploading
arch/sandbox/include/asm/eth.h | 4 + cmd/Kconfig | 35 + cmd/net.c | 55 +- include/net-legacy.h | 7 +- include/net/httpd-upload.h | 12 + include/net/httpd.h | 71 ++ include/net/netcat.h | 20 + include/net/tcp.h | 258 ++++++- include/net/wget.h | 8 - net/Kconfig | 14 + net/Makefile | 3 + net/fastboot_tcp.c | 193 ++--- net/httpd-upload.c | 173 +++++ net/httpd.c | 735 ++++++++++++++++++ net/net.c | 60 +- net/netcat.c | 194 +++++ net/tcp.c | 1297 ++++++++++++++++++++++---------- net/wget.c | 476 ++++-------- test/cmd/wget.c | 58 +- 19 files changed, 2766 insertions(+), 907 deletions(-) create mode 100644 include/net/httpd-upload.h create mode 100644 include/net/httpd.h create mode 100644 include/net/netcat.h create mode 100644 net/httpd-upload.c create mode 100644 net/httpd.c create mode 100644 net/netcat.c