[tcp] Avoid setting PSH flag when SYN flag is set
authorMichael Brown <mcb30@etherboot.org>
Tue, 10 Mar 2009 08:15:47 +0000 (08:15 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 10 Mar 2009 08:15:47 +0000 (08:15 +0000)
Some firewall devices seem to regard SYN,PSH as an invalid flag
combination and reject the packet.  Fix by setting PSH only if SYN is
not set.

Reported-by: DSE Incorporated <dseinc@gmail.com>
src/net/tcp.c

index 6bcd193..0ef6577 100644 (file)
@@ -471,6 +471,8 @@ static int tcp_xmit ( struct tcp_connection *tcp, int force_send ) {
                tsopt->tsopt.tsval = ntohl ( currticks() );
                tsopt->tsopt.tsecr = ntohl ( tcp->ts_recent );
        }
+       if ( ! ( flags & TCP_SYN ) )
+               flags |= TCP_PSH;
        tcphdr = iob_push ( iobuf, sizeof ( *tcphdr ) );
        memset ( tcphdr, 0, sizeof ( *tcphdr ) );
        tcphdr->src = tcp->local_port;
@@ -478,7 +480,7 @@ static int tcp_xmit ( struct tcp_connection *tcp, int force_send ) {
        tcphdr->seq = htonl ( tcp->snd_seq );
        tcphdr->ack = htonl ( tcp->rcv_ack );
        tcphdr->hlen = ( ( payload - iobuf->data ) << 2 );
-       tcphdr->flags = ( flags | TCP_PSH );
+       tcphdr->flags = flags;
        tcphdr->win = htons ( tcp->rcv_win );
        tcphdr->csum = tcpip_chksum ( iobuf->data, iob_len ( iobuf ) );