Просмотр исходного кода

[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 лет назад
Родитель
Сommit
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
 

Загрузка…
Отмена
Сохранить