Procházet zdrojové kódy

[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 před 17 roky
rodič
revize
3ed468e0c5
1 změnil soubory, kde provedl 3 přidání a 1 odebrání
  1. 3
    1
      src/net/tcp.c

+ 3
- 1
src/net/tcp.c Zobrazit soubor

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
 

Načítá se…
Zrušit
Uložit