====== Differences ====== This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
soc:2010:cooldavid:journal:week10 [2010/07/29 07:44] cooldavid |
soc:2010:cooldavid:journal:week10 [2010/07/30 04:14] (current) cooldavid |
||
---|---|---|---|
Line 2: | Line 2: | ||
=== Shortlog of iPXE merge commits === | === Shortlog of iPXE merge commits === | ||
+ | [[http://git.etherboot.org/?p=people/cooldavid/gpxe.git;a=shortlog;h=refs/heads/tcpfix|Git-branch]] | ||
* Guo-Fu Tseng (2): | * Guo-Fu Tseng (2): | ||
* [tcp] Randomize TCP bind port | * [tcp] Randomize TCP bind port | ||
Line 24: | Line 24: | ||
If we want to support Selective ACK in the future, we don't want to discard | If we want to support Selective ACK in the future, we don't want to discard | ||
any packet. | any packet. | ||
+ | |||
+ | [[https://git.ipxe.org/ipxe.git/commitdiff/1d3b6619e5e35eecc29efcef6eb1dd3564a2eb45|Commit diff on iPXE]] | ||
+ | |||
+ | [[https://git.ipxe.org/ipxe.git/commitdiff/9dc51afa2cc2b0d8310b540ae193edb37f148b8b|Commit diff on iPXE]] | ||
+ | |||
<file> | <file> | ||
commit 1d3b6619e5e35eecc29efcef6eb1dd3564a2eb45 | commit 1d3b6619e5e35eecc29efcef6eb1dd3564a2eb45 | ||
Line 63: | Line 68: | ||
Selective ACK support with possibly using deliver_raw() for | Selective ACK support with possibly using deliver_raw() for | ||
performance concern. | performance concern. | ||
+ | |||
+ | [[https://git.ipxe.org/ipxe.git/commitdiff/4327d5d39f101f1df0ace6c03f3b3ada5f6a6213|Commit diff on iPXE]] | ||
+ | |||
<file> | <file> | ||
commit 4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 | commit 4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 | ||
Line 84: | Line 92: | ||
==== Re-do my previous TCP patches against merged branch ==== | ==== Re-do my previous TCP patches against merged branch ==== | ||
- | aaaaa | + | [[http://git.etherboot.org/?p=people/cooldavid/gpxe.git;a=shortlog;h=refs/heads/tcpfix2|Git-branch]] |
- | ==== Post the patches on the gpxe-devel and wait for feedback ==== | + | <file> |
- | bbbbb | + | commit be160f2a9581ca791f038cff0ca476f19d8fbc0e |
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Thu Jul 15 11:02:52 2010 +0800 | ||
+ | [tcp core][RFC] Wait for TCP to safely close | ||
+ | |||
+ | After some discussion with Piotr and Michael, I think it might | ||
+ | be an acceptable solution for the issue that gPXE leaves remote | ||
+ | peer TCP in undesired state. | ||
+ | |||
+ | The reason I don't mark activity_start at somewhere like tcp_open | ||
+ | or ESTABLISHED is that sanboot do not close the TCP connection | ||
+ | before hand of the control to OS. | ||
+ | |||
+ | src/core/activity.c | 64 +++++++++++++++++++++++++++++++++++++++++++ | ||
+ | src/core/image.c | 8 +++++ | ||
+ | src/core/main.c | 2 + | ||
+ | src/include/gpxe/activity.h | 28 +++++++++++++++++++ | ||
+ | src/include/gpxe/tcp.h | 13 +++++++++ | ||
+ | src/net/tcp.c | 15 ++++++++++ | ||
+ | src/usr/autoboot.c | 6 ++++ | ||
+ | 7 files changed, 136 insertions(+), 0 deletions(-) | ||
+ | |||
+ | </file> | ||
+ | <file> | ||
+ | commit 4c985888acf02acc9bf2d94925279e7a14cbc779 | ||
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Wed May 12 09:26:08 2010 +0800 | ||
+ | |||
+ | [jme] Adding hardware RX checksum offload support | ||
+ | |||
+ | Read corresponding flags for RX checksum status, and update the | ||
+ | csum_stat field of the struct io_buffer. | ||
+ | |||
+ | src/drivers/net/jme.c | 24 ++++++++++++++++++++++++ | ||
+ | 1 files changed, 24 insertions(+), 0 deletions(-) | ||
+ | |||
+ | </file> | ||
+ | <file> | ||
+ | commit 134fe7eef6f1e1a4603d58524e0b4e73265ea9cb | ||
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Wed May 12 09:22:11 2010 +0800 | ||
+ | |||
+ | [net] Adding RX packet checksum offload support | ||
+ | |||
+ | Add a field in struct io_buffer to pass checksum status from hardware. | ||
+ | If the hardware dose not support just ignore this field, it'll work as | ||
+ | usual. | ||
+ | |||
+ | I see that net/ipv6 does not check for checksum, so I temporary ignored | ||
+ | it. | ||
+ | |||
+ | src/core/iobuf.c | 1 + | ||
+ | src/include/gpxe/iobuf.h | 13 +++++++++++++ | ||
+ | src/net/ipv4.c | 8 +++++--- | ||
+ | src/net/tcp.c | 18 ++++++++++-------- | ||
+ | src/net/udp.c | 2 +- | ||
+ | 5 files changed, 30 insertions(+), 12 deletions(-) | ||
+ | |||
+ | </file> | ||
+ | <file> | ||
+ | commit 155da1968f5e89c38cd5f7d76c4c44c9784f83ff | ||
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Fri Jul 30 16:08:28 2010 +0800 | ||
+ | |||
+ | [tcp] Cleanup tcp_close() | ||
+ | |||
+ | The complexity of tcp_close() makes the TCP closing control | ||
+ | hard to maintain. | ||
+ | This patch try to solve it by separating tcp_terminate() and | ||
+ | tcp_dataxfer_close() from tcp_close(). | ||
+ | |||
+ | Use tcp_terminate() to immediately free all tcp resources, and | ||
+ | close data transfer interface by calling tcp_dataxfer_close(). | ||
+ | |||
+ | tcp_close() now simply bing TCP connection to closing state. | ||
+ | Which makes it safe to call in tcp_rx_fin(). | ||
+ | |||
+ | tcp_dataxfer_close() is separated due to early close timing of | ||
+ | tcp_xfer_close() which is called by upper-layer to indicate no | ||
+ | more data to send or receive. | ||
+ | |||
+ | src/net/tcp.c | 104 +++++++++++++++++++++++++++++--------------------------- | ||
+ | 1 files changed, 54 insertions(+), 50 deletions(-) | ||
+ | |||
+ | </file> | ||
+ | <file> | ||
+ | commit 7345fc858e6ee2f414ee8328b710b6a333a2be19 | ||
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Thu Jul 29 21:43:05 2010 +0800 | ||
+ | |||
+ | [tcp] Distinguish passive and active close with proper actions | ||
+ | |||
+ | The original design of TCP stack dose not distinguish passive and active | ||
+ | close, support is to make close action more compatible with RFC 793 and | ||
+ | having the ability to benefit from passive closing that can release all | ||
+ | resources immediately. | ||
+ | |||
+ | src/include/gpxe/tcp.h | 43 ++++++++++++++++++++++++++++++++++++------- | ||
+ | src/net/tcp.c | 26 +++++++++++++++++++++----- | ||
+ | 2 files changed, 57 insertions(+), 12 deletions(-) | ||
+ | |||
+ | </file> | ||
+ | <file> | ||
+ | commit bdee331b5ba32557bbd092987be0af3cc1c45479 | ||
+ | Author: Guo-Fu Tseng <cooldavid@cooldavid.org> | ||
+ | Date: Thu Jul 29 21:16:24 2010 +0800 | ||
+ | |||
+ | [tcp] Deliver data only after updating TCP state | ||
+ | |||
+ | Michael suggested something like: | ||
+ | =============================================================== | ||
+ | struct list_head received = LIST_HEAD_INIT ( received ); | ||
+ | ... | ||
+ | while ( ! list_empty ( &tcp->rx_queue ) ) { | ||
+ | ... | ||
+ | tcp_rx_data ( tcp, seq, iob_disown ( iobuf ), &received ); | ||
+ | ... | ||
+ | } | ||
+ | |||
+ | list_for_each_entry_safe ( iobuf, tmp, &received, list ) { | ||
+ | // deliver iobuf via xfer_deliver_iob() | ||
+ | } | ||
+ | |||
+ | if ( tcp->state & TCP_STATE_RCVD ( TCP_FIN ) ) | ||
+ | tcp_close ( tcp, 0 ); | ||
+ | =============================================================== | ||
+ | But after some thought I think making the change like this commit | ||
+ | can have same behavior, but simplified by not using extra queue. | ||
+ | Which can also save some code size. | ||
+ | |||
+ | In this patch: | ||
+ | 1. We call xfer_deliver_iob() after fully updated/handled received TCP | ||
+ | state. In which to have better timing that upper-layer protocol | ||
+ | might call tcp_xfer_close() to initiate a shutdown, or sending | ||
+ | extra data. | ||
+ | 2. We move tcp_close() out from tcp_rx_fin() because tcp_close() | ||
+ | nullified the xfer interface. It'll cause error to call | ||
+ | xfer_deliver_iob() after tcp_rx_fin(). | ||
+ | (So that I proposed an idea to clean up tcp_close(), I'll post it | ||
+ | in later commit.) | ||
+ | |||
+ | src/net/tcp.c | 34 +++++++++++++++++++--------------- | ||
+ | 1 files changed, 19 insertions(+), 15 deletions(-) | ||
+ | </file> | ||
+ | |||
+ | ==== Post the patches on the gpxe-devel and wait for feedback ==== |