Browse Source

[tcp] Avoid setting PSH flag when SYN flag is set

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>
tags/v0.9.8
Michael Brown 15 years ago
parent
commit
3ed468e0c5
1 changed files with 3 additions and 1 deletions
  1. 3
    1
      src/net/tcp.c

+ 3
- 1
src/net/tcp.c View File

471
 		tsopt->tsopt.tsval = ntohl ( currticks() );
471
 		tsopt->tsopt.tsval = ntohl ( currticks() );
472
 		tsopt->tsopt.tsecr = ntohl ( tcp->ts_recent );
472
 		tsopt->tsopt.tsecr = ntohl ( tcp->ts_recent );
473
 	}
473
 	}
474
+	if ( ! ( flags & TCP_SYN ) )
475
+		flags |= TCP_PSH;
474
 	tcphdr = iob_push ( iobuf, sizeof ( *tcphdr ) );
476
 	tcphdr = iob_push ( iobuf, sizeof ( *tcphdr ) );
475
 	memset ( tcphdr, 0, sizeof ( *tcphdr ) );
477
 	memset ( tcphdr, 0, sizeof ( *tcphdr ) );
476
 	tcphdr->src = tcp->local_port;
478
 	tcphdr->src = tcp->local_port;
478
 	tcphdr->seq = htonl ( tcp->snd_seq );
480
 	tcphdr->seq = htonl ( tcp->snd_seq );
479
 	tcphdr->ack = htonl ( tcp->rcv_ack );
481
 	tcphdr->ack = htonl ( tcp->rcv_ack );
480
 	tcphdr->hlen = ( ( payload - iobuf->data ) << 2 );
482
 	tcphdr->hlen = ( ( payload - iobuf->data ) << 2 );
481
-	tcphdr->flags = ( flags | TCP_PSH );
483
+	tcphdr->flags = flags;
482
 	tcphdr->win = htons ( tcp->rcv_win );
484
 	tcphdr->win = htons ( tcp->rcv_win );
483
 	tcphdr->csum = tcpip_chksum ( iobuf->data, iob_len ( iobuf ) );
485
 	tcphdr->csum = tcpip_chksum ( iobuf->data, iob_len ( iobuf ) );
484
 
486
 

Loading…
Cancel
Save