Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
soc:2010:cooldavid:journal:week10 [2010/07/29 07:32]
cooldavid created
soc:2010:cooldavid:journal:week10 [2010/07/30 04:14] (current)
cooldavid
Line 1: Line 1:
-===== Create a branch to merge latest iPXE TCP related commits based on gPXE master ​===== +==== Create a branch to merge latest iPXE TCP related commits based on gPXE master ====
- +
-==== 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 20: Line 20:
     * [tcp] Fix a 64bit compile time error     * [tcp] Fix a 64bit compile time error
  
-==== Commits that I choosed not to merge ==== +=== Commits that I choosed not to merge === 
- +== Discard out-of-order when low memory ==
-=== Discard out-of-order when low memory ​===+
 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 59: Line 63:
 </​file>​ </​file>​
  
-===== Re-do my previous TCP patches against merged branch ===== +== Generic xfer interface ​== 
-aaaaa+"​deliver_raw() no longer exists as a data-xfer method"​ 
 +We might need it someday, I did think of some approach to do 
 +Selective ACK support with possibly using deliver_raw() for 
 +performance concern.
  
-===== Post the patches on the gpxe-devel and wait for feedback ​===== +[[https://​git.ipxe.org/​ipxe.git/​commitdiff/​4327d5d39f101f1df0ace6c03f3b3ada5f6a6213|Commit diff on iPXE]] 
-bbbbb+ 
 +<​file>​ 
 +commit 4327d5d39f101f1df0ace6c03f3b3ada5f6a6213 
 +Author: Michael Brown <​mcb30@ipxe.org>​ 
 +Date:   Wed Jun 16 01:31:29 2010 +0100 
 + 
 +    [interface] Convert all data-xfer interfaces to generic interfaces 
 + 
 +    Remove data-xfer as an interface type, and replace data-xfer 
 +    interfaces with generic interfaces supporting the data-xfer methods. 
 + 
 +    Filter interfaces (as used by the TLS layer) are handled using the 
 +    generic pass-through interface capability. ​ A side-effect of this is 
 +    that deliver_raw() no longer exists as a data-xfer method. ​ (In 
 +    practice this doesn'​t lose any efficiency, since there are no 
 +    instances within the current codebase where xfer_deliver_raw() is used 
 +    to pass data to an interface supporting the deliver_raw() method.) 
 + 
 +    Signed-off-by:​ Michael Brown <​mcb30@ipxe.org>​ 
 +</​file>​ 
 + 
 +==== Re-do my previous TCP patches against merged branch ​==== 
 +[[http://​git.etherboot.org/?​p=people/​cooldavid/​gpxe.git;​a=shortlog;​h=refs/​heads/​tcpfix2|Git-branch]] 
 + 
 +<​file>​ 
 +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 ====

Navigation

* [[:start|Home]] * [[:about|About our Project]] * [[:download|Download]] * [[:screenshots|Screenshots]] * Documentation * [[:howtos|HowTo Guides]] * [[:appnotes|Application Notes]] * [[:faq:|FAQs]] * [[:doc|General Doc]] * [[:talks|Videos, Talks, and Papers]] * [[:hardwareissues|Hardware Issues]] * [[:mailinglists|Mailing lists]] * [[http://support.etherboot.org/|Bugtracker]] * [[:contributing|Contributing]] * [[:editing_permission|Wiki Edit Permission]] * [[:wiki:syntax|Wiki Syntax]] * [[:contact|Contact]] * [[:relatedlinks|Related Links]] * [[:commerciallinks|Commercial Links]] * [[:acknowledgements|Acknowledgements]] * [[:logos|Logo Art]]

QR Code
QR Code soc:2010:cooldavid:journal:week10 (generated for current page)