diff options
author | Michael Brown | 2007-01-13 18:36:17 +0100 |
---|---|---|
committer | Michael Brown | 2007-01-13 18:36:17 +0100 |
commit | 526d314266f1648ae79d8cdd380edb371fb69e4b (patch) | |
tree | 5284562a3282e8bd7b2652b33563c764fa48cb10 /src/net/tcp.c | |
parent | I prefer IMAGE_XXX to XXX_IMAGE. (diff) | |
download | ipxe-526d314266f1648ae79d8cdd380edb371fb69e4b.tar.gz ipxe-526d314266f1648ae79d8cdd380edb371fb69e4b.tar.xz ipxe-526d314266f1648ae79d8cdd380edb371fb69e4b.zip |
Advertise a larger MSS to improve TCP performance.
Diffstat (limited to 'src/net/tcp.c')
-rw-r--r-- | src/net/tcp.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/net/tcp.c b/src/net/tcp.c index f50c776a..6496239f 100644 --- a/src/net/tcp.c +++ b/src/net/tcp.c @@ -229,6 +229,8 @@ static int tcp_senddata_conn ( struct tcp_connection *conn, int force_send ) { struct tcp_application *app = conn->app; struct pk_buff *pkb; struct tcp_header *tcphdr; + struct tcp_mss_option *mssopt; + void *payload; unsigned int flags; size_t len; size_t seq_len; @@ -289,13 +291,20 @@ static int tcp_senddata_conn ( struct tcp_connection *conn, int force_send ) { start_timer ( &conn->timer ); /* Fill up the TCP header */ + payload = pkb->data; + if ( flags & TCP_SYN ) { + mssopt = pkb_push ( pkb, sizeof ( *mssopt ) ); + mssopt->kind = TCP_OPTION_MSS; + mssopt->length = sizeof ( *mssopt ); + mssopt->mss = htons ( TCP_MSS ); + } tcphdr = pkb_push ( pkb, sizeof ( *tcphdr ) ); memset ( tcphdr, 0, sizeof ( *tcphdr ) ); tcphdr->src = conn->local_port; tcphdr->dest = conn->peer.st_port; tcphdr->seq = htonl ( conn->snd_seq ); tcphdr->ack = htonl ( conn->rcv_ack ); - tcphdr->hlen = ( ( sizeof ( *tcphdr ) / 4 ) << 4 ); + tcphdr->hlen = ( ( payload - pkb->data ) << 2 ); tcphdr->flags = flags; tcphdr->win = htons ( TCP_WINDOW_SIZE ); tcphdr->csum = tcpip_chksum ( pkb->data, pkb_len ( pkb ) ); |