]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
Define "connected" as
authorMichael Brown <mcb30@etherboot.org>
Tue, 9 Jan 2007 05:01:22 +0000 (05:01 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 9 Jan 2007 05:01:22 +0000 (05:01 +0000)
  "when SYN is ACKed and we have already received SYN", or
  "when SYN is received and we have already had SYN ACKed"

rather than just

  "when SYN is ACKed"

This avoids spuriously calling the connected() method when we receive
a RST,ACK in response to a SYN.

src/net/tcp.c

index cc556284922c3c4e316d87d12275add6690b11d5..8df01f3eac85cef00f41512ce8e41bf2e73c93b8 100644 (file)
@@ -492,6 +492,7 @@ static struct tcp_connection * tcp_demux ( uint16_t local_port ) {
  * @ret rc             Return status code
  */
 static int tcp_rx_syn ( struct tcp_connection *conn, uint32_t seq ) {
+       struct tcp_application *app = conn->app;
 
        /* Synchronise sequence numbers on first SYN */
        if ( ! ( conn->tcp_state & TCP_STATE_RCVD ( TCP_SYN ) ) )
@@ -508,6 +509,11 @@ static int tcp_rx_syn ( struct tcp_connection *conn, uint32_t seq ) {
        /* Acknowledge SYN */
        conn->rcv_ack++;
 
+       /* Notify application of established connection, if applicable */
+       if ( ( conn->tcp_state & TCP_STATE_ACKED ( TCP_SYN ) ) &&
+            app && app->tcp_op->connected )
+               app->tcp_op->connected ( app );
+
        return 0;
 }
 
@@ -565,7 +571,9 @@ static int tcp_rx_ack ( struct tcp_connection *conn, uint32_t ack,
                conn->tcp_state |= TCP_STATE_ACKED ( acked_flags );
 
        /* Notify application of established connection, if applicable */
-       if ( ( acked_flags & TCP_SYN ) && app && app->tcp_op->connected )
+       if ( ( acked_flags & TCP_SYN ) &&
+            ( conn->tcp_state & TCP_STATE_RCVD ( TCP_SYN ) ) &&
+            app && app->tcp_op->connected )
                app->tcp_op->connected ( app );
 
        return 0;