[...]

Some of the problems seen on the server using the
newly converted load balancer driver for bge GLDV3
interface are below.  We set tcp_trace and tcp_debug and use
strace to see these errors on the server node.

1.  The SYN packet coming from the client into the
   traffic cop node and forwarded to the server node
   is getting an "unacceptable sequence number gap"
   error from the TCP layer on the server.

2.  TCP Duplicate segment counter increments
   from the TCP layer on the server.

3.  TCP Duplicate Ack counter increments
   from the TCP layer on the server.

4.  "bad_ack" in SYN_RCVD state.

To get a sense for what's happening in TCP, I'd use dtrace in
tcp_conn_request() and tcp_rput_data() and print out the tcp_t
(get this from the conn_t in arg0) along with its state, snxt,
suna and rnxt. Additionally, also print out the TCP header from
the incoming packet (arg1), the seq, ack and flags, something
like:

fbt::tcp_conn_request:entry
{
        connp = (conn_t *)arg0;
        tcp = (tcp_t *)connp->conn_tcp;
        ipha = (ipha_t *)((mblk_t *)arg1)->b_rptr;
        /* 20 - assuming no IP options etc. */
        tcph = (tcph_t *)((uchar_t *)ipha  + 20);

        printf("\tTCP %p state %d suna %u snxt %u rnxt %u\n",
            tcp, tcp->tcp_state, tcp->tcp_suna, tcp->tcp_snxt,
            tcp->tcp_rnxt);
        printf("\tlport %u dport %u\n", *(uint16_t *)tcph->th_lport,
            *(uint16_t *)tcph->th_fport);
        printf("\tseq %u ack %u flags %x\n",
            *(uint32_t *)tcph->th_seq, *(uint32_t *)tcph->th_ack,
            *tcph->th_flags);
}

similarly for tcp_rput_data.

(on an x86 machine you would need to print out the TCP header content
taking endianness into consideration).

I suppose you could restrict the dtrace probes to the interested port.

Ordinarily, I'd expect the SYN to come into tcp_conn_request(),
which will result in sending the SYN-ACK and transitioning to
SYN-RCVD.  The ACK from the client will be processed in tcp_rput_data.

You can check the code in tcp_rput_data() that result in the
messages/conditions that you list above.

Look at:
  http://cvs.opensolaris.org/source/xref/on/usr/src/uts/common/inet/tcp.h

for the TCP structure (tcp_t) and TCP header structure (tcph_t)

Look at:
  http://cvs.opensolaris.org/source/xref/on/usr/src/uts/common/inet/tcp/tcp.c

for tcp_conn_request() and tcp_rput_data() - L12764-12789, L12903-12961 etc.

-venu



Thanks,
Dan


This message posted from opensolaris.org
_______________________________________________
networking-discuss mailing list
[email protected]












_______________________________________________
networking-discuss mailing list
[email protected]

Reply via email to