]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[tcp] Allow sufficient headroom for TCP headers
authorMichael Brown <mcb30@ipxe.org>
Mon, 19 Sep 2011 14:48:57 +0000 (15:48 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 19 Sep 2011 14:52:54 +0000 (15:52 +0100)
TCP currently neglects to allow sufficient space for its own headers
when allocating I/O buffers.  This problem is masked by the fact that
the maximum link-layer header size (802.11) is substantially larger
than the common Ethernet link-layer header.

Fix by allowing sufficient space for any TCP headers, as well as the
network-layer and link-layer headers.

Reported-by: Scott K Logan <logans@cottsay.net>
Debugged-by: Scott K Logan <logans@cottsay.net>
Tested-by: Scott K Logan <logans@cottsay.net>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/tcp.h
src/net/tcp.c

index 197712b1188b84b7c6a2437027670a7f899eee6c..7084af60efab8ea00c3d40697dafcd528e65a05e 100644 (file)
@@ -308,6 +308,16 @@ struct tcp_options {
  */
 #define TCP_MSL ( 2 * 60 * TICKS_PER_SEC )
 
+/**
+ * TCP maximum header length
+ *
+ */
+#define TCP_MAX_HEADER_LEN                                     \
+       ( MAX_LL_NET_HEADER_LEN +                               \
+         sizeof ( struct tcp_header ) +                        \
+         sizeof ( struct tcp_mss_option ) +                    \
+         sizeof ( struct tcp_timestamp_padded_option ) )
+
 /**
  * Compare TCP sequence numbers
  *
index 4df1aed50c732090aaad8927e74e852f6eedeb9f..0a7924a71e7a79d9d0f1ef5bd131a17a6e209dcb 100644 (file)
@@ -509,14 +509,14 @@ static int tcp_xmit ( struct tcp_connection *tcp ) {
                start_timer ( &tcp->timer );
 
        /* Allocate I/O buffer */
-       iobuf = alloc_iob ( len + MAX_LL_NET_HEADER_LEN );
+       iobuf = alloc_iob ( len + TCP_MAX_HEADER_LEN );
        if ( ! iobuf ) {
                DBGC ( tcp, "TCP %p could not allocate iobuf for %08x..%08x "
                       "%08x\n", tcp, tcp->snd_seq, ( tcp->snd_seq + seq_len ),
                       tcp->rcv_ack );
                return -ENOMEM;
        }
-       iob_reserve ( iobuf, MAX_LL_NET_HEADER_LEN );
+       iob_reserve ( iobuf, TCP_MAX_HEADER_LEN );
 
        /* Fill data payload from transmit queue */
        tcp_process_tx_queue ( tcp, len, iobuf, 0 );
@@ -653,14 +653,14 @@ static int tcp_xmit_reset ( struct tcp_connection *tcp,
        int rc;
 
        /* Allocate space for dataless TX buffer */
-       iobuf = alloc_iob ( MAX_LL_NET_HEADER_LEN );
+       iobuf = alloc_iob ( TCP_MAX_HEADER_LEN );
        if ( ! iobuf ) {
                DBGC ( tcp, "TCP %p could not allocate iobuf for RST "
                       "%08x..%08x %08x\n", tcp, ntohl ( in_tcphdr->ack ),
                       ntohl ( in_tcphdr->ack ), ntohl ( in_tcphdr->seq ) );
                return -ENOMEM;
        }
-       iob_reserve ( iobuf, MAX_LL_NET_HEADER_LEN );
+       iob_reserve ( iobuf, TCP_MAX_HEADER_LEN );
 
        /* Construct RST response */
        tcphdr = iob_push ( iobuf, sizeof ( *tcphdr ) );