This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Bugreport: Error in CC3000 TCP implementation



Hi,

I am seeing intermittent problems on TCP connection establishment (through accept() and connection termination (through closesocket()). Since my application is absolutely trivial (webserver allowing one request at a time) I took a close look at what happens at the TCP level and found the following:

The SYN ACK response from the CC3000 to a SYN seq=x request from a browser has a wrong ACK Number (ACK=x instead of x+1). This happens for me in 19 out of 20 cases. This starts happening to me after this happens, which happens almost always on the first to third access from the browser:

The ACK Paket in response to a FIN seq=x packet from the browser has a wrong ACK number (x instead of x+1). 

In both cases the browser retries and finally RST the connection which self heals these problems, but only after a latency of 1s which is not acceptable.

I am using SP1.7 and I have ported the Host Driver on an Atmel SAM3S.

Below is the output from tcpdump. Address 192.168.1.100 is the CC3000 and .146 is the PC. Note how the seq and ack numbers are the same in the erroneous cases and how a bad connection termination causes the following connection establishment to be also bad.

With this bug present the CC3000 is unusable even for trivial TCP applications. I am looking forward to get this fixed.

You might argue that there is a webserver example for download. This can be used to lock up the CC3000 by pressing reload rapidly 10 times and probably suffers from similar problems.

Cheers,

Johannes

Start: ok, end: error
19:00:41.757102 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [S], seq 2635718664, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957526003 ecr 0,sackOK,eol], length 0
19:00:41.771801 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [S.], seq 735186398, ack 2635718665, win 1460, options [mss 1460], length 0
19:00:41.771976 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 1, win 65535, length 0
19:00:41.772147 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [P.], seq 1:117, ack 1, win 65535, length 116
19:00:41.784384 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [.], ack 117, win 1460, length 0
19:00:41.823894 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [P.], seq 1:84, ack 117, win 1460, length 83
19:00:41.823998 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 84, win 65535, length 0
19:00:41.843004 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [P.], seq 84:1544, ack 117, win 1460, length 1460
19:00:41.843044 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 1544, win 65535, length 0
19:00:41.862455 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [P.], seq 1544:3004, ack 117, win 1460, length 1460
19:00:41.862518 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 3004, win 65535, length 0
19:00:41.876547 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [P.], seq 3004:3142, ack 117, win 1460, length 138
19:00:41.876632 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 3142, win 65535, length 0
19:00:41.879901 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [F.], seq 3142, ack 117, win 1460, length 0
19:00:41.879965 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [.], ack 3143, win 65535, length 0
19:00:41.880358 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
19:00:41.891886 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [.], ack 117, win 1460, length 0
19:00:41.891934 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
19:00:42.258148 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
19:00:42.268434 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [R], seq 735189541, win 1460, length 0

Start: error, end: error
19:01:46.890189 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [S], seq 510352505, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957591001 ecr 0,sackOK,eol], length 0
19:01:46.900779 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [S.], seq 735189541, ack 510352505, win 1460, options [mss 1460], length 0
19:01:46.900870 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [R], seq 510352505, win 0, length 0
19:01:46.904478 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [R.], seq 3559777755, ack 1, win 1460, length 0
19:01:47.978220 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [S], seq 510352505, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957592099 ecr 0], length 0
19:01:47.989494 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [S.], seq 776500819, ack 510352506, win 1460, options [mss 1460], length 0
19:01:47.989686 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 1, win 65535, length 0
19:01:47.989871 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [P.], seq 1:117, ack 1, win 65535, length 116
19:01:47.999901 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [.], ack 117, win 1460, length 0
19:01:48.318429 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [P.], seq 1:84, ack 117, win 1460, length 83
19:01:48.318521 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 84, win 65535, length 0
19:01:48.337078 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [P.], seq 84:1544, ack 117, win 1460, length 1460
19:01:48.337117 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 1544, win 65535, length 0
19:01:48.371113 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [P.], seq 1544:3004, ack 117, win 1460, length 1460
19:01:48.371193 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 3004, win 65535, length 0
19:01:48.386488 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [P.], seq 3004:3142, ack 117, win 1460, length 138
19:01:48.386590 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 3142, win 65535, length 0
19:01:48.387111 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [F.], seq 3142, ack 117, win 1460, length 0
19:01:48.387223 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [.], ack 3143, win 65535, length 0
19:01:48.387617 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
19:01:48.398113 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [.], ack 117, win 1460, length 0
19:01:48.398204 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
19:01:48.410171 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [R], seq 776503962, win 1460, length 0

Start: error, end: ok
19:03:05.113356 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [S], seq 3820235014, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957668112 ecr 0,sackOK,eol], length 0
19:03:05.123460 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [S.], seq 111376188, ack 3820235014, win 1460, options [mss 1460], length 0
19:03:05.123607 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [R], seq 3820235014, win 0, length 0
19:03:06.215663 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [S], seq 3820235014, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957669210 ecr 0], length 0
19:03:06.227976 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [S.], seq 148638710, ack 3820235015, win 1460, options [mss 1460], length 0
19:03:06.228110 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 1, win 65535, length 0
19:03:06.228228 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [P.], seq 1:117, ack 1, win 65535, length 116
19:03:06.239343 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [.], ack 117, win 1460, length 0
19:03:06.550321 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [P.], seq 1:84, ack 117, win 1460, length 83
19:03:06.550491 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 84, win 65535, length 0
19:03:06.568961 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [P.], seq 84:1544, ack 117, win 1460, length 1460
19:03:06.569023 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 1544, win 65535, length 0
19:03:06.592178 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [P.], seq 1544:3004, ack 117, win 1460, length 1460
19:03:06.592222 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 3004, win 65535, length 0
19:03:06.611793 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [P.], seq 3004:3143, ack 117, win 1460, length 139
19:03:06.611799 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [F.], seq 3143, ack 117, win 1460, length 0
19:03:06.611849 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 3143, win 65535, length 0
19:03:06.611863 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [.], ack 3144, win 65535, length 0
19:03:06.612258 IP 192.168.1.146.54296 > 192.168.1.100.80: Flags [F.], seq 117, ack 3144, win 65535, length 0
19:03:06.620524 IP 192.168.1.100.80 > 192.168.1.146.54296: Flags [.], ack 118, win 1460, length 0

Start: ok, end: error
19:04:29.762710 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [S], seq 2328543473, win 65535, options [mss 1460,nop,wscale 3,nop,nop,TS val 957752432 ecr 0,sackOK,eol], length 0
19:04:29.772495 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [S.], seq 493240524, ack 2328543474, win 1460, options [mss 1460], length 0
19:04:29.772687 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 1, win 65535, length 0
19:04:29.772883 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [P.], seq 1:117, ack 1, win 65535, length 116
19:04:29.782603 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [.], ack 117, win 1460, length 0
19:04:30.095539 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [P.], seq 1:84, ack 117, win 1460, length 83
19:04:30.095599 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 84, win 65535, length 0
19:04:30.117447 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [P.], seq 84:1544, ack 117, win 1460, length 1460
19:04:30.117510 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 1544, win 65535, length 0
19:04:30.139319 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [P.], seq 1544:3004, ack 117, win 1460, length 1460
19:04:30.139412 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 3004, win 65535, length 0
19:04:30.157503 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [P.], seq 3004:3143, ack 117, win 1460, length 139
19:04:30.157535 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 3143, win 65535, length 0
19:04:30.158635 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [F.], seq 3143, ack 117, win 1460, length 0
19:04:30.158682 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [.], ack 3144, win 65535, length 0
19:04:30.159082 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [F.], seq 117, ack 3144, win 65535, length 0
19:04:30.168345 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [.], ack 117, win 1460, length 0
19:04:30.168485 IP 192.168.1.146.54302 > 192.168.1.100.80: Flags [F.], seq 117, ack 3144, win 65535, length 0
19:04:30.179994 IP 192.168.1.100.80 > 192.168.1.146.54302: Flags [R], seq 493243668, win 1460, length 0

  • Hi Johannes, 

    In the first part of the log : 

    19:00:41.880358 IP 192.168.1.146.54285 > 192.168.1.100.80: Flags [F.], seq 117, ack 3143, win 65535, length 0
    19:00:41.891886 IP 192.168.1.100.80 > 192.168.1.146.54285: Flags [.], ack 117, win 1460, length 0

    Just to confirm your statement:  The ACK Paket in response to a FIN seq=x packet from the browser has a wrong ACK number (x instead of x+1). 

    The highlighted ack  value should be 118 instead, right? 

    Then the sync ack is also x instead of x+1:

    19:01:46.890189 IP 192.168.1.146.54286 > 192.168.1.100.80: Flags [S], seq 510352505, win 65535, 
    19:01:46.900779 IP 192.168.1.100.80 > 192.168.1.146.54286: Flags [S.], seq 735189541, ack 510352505, win 1460, 

    Again the highlighted ack value should be 510352506, correct. 

    For sure we will take a look and let you know the results. 

    Pedro

  • Correct on the 117 which should be a 118. The ACK packets to a SYN or FIN packet must have an ack value of one higher than the previous packet.

    Also correct in the second case, should be 510352506, yes.

    Note that the ack value are not systematically that wrong. This occurs sporadically, but quite often, and within somewhat deterministic patterns.

    This is a complete show stopper for using the CC3000 for really anything.

    Please try to get TCP connections working reliably under all circumstances. It is no use releasing any new firmware before this works.