瀏覽代碼

[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 16 年之前
父節點
當前提交
3ed468e0c5
共有 1 個文件被更改,包括 3 次插入1 次删除
  1. 3
    1
      src/net/tcp.c

+ 3
- 1
src/net/tcp.c 查看文件

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…
取消
儲存