FreeRTOSIP-TCP Connection issue

I’ve been using UDP for some time now. Attempting to use TCP with this stack. In another post, I had an issue with FreeRTOSselect not working with a Listen socker because a FreeRTOSConfig setting was in conflict with the FreeRTOSselect’s capability. I’m wondering if the issue that follows is also associated with conflicting CONFIG settings. My TCP usage is a small web server. Chrome is attempting to connect. FreeRTOSIP identifies the incoming connection and my code issues FreeRTOS_accept. Chrome does not like the connections and closes all of the connections without ever attempting to send data to the connection. I have a WireShark listing showing MY side of the communication — notice all of the re-tries. Following the WireShark listing are the stack’s debug messages that are generated during the process. Chrome is 192.1689.1.37 FreeRTOSIP is 192.168.1.12 Stack Debug Listing: ~~~ Debugger Active IP 192.168.1.37 PixelBoard Debugger Active IP 192.168.1.12 D:7:28 AM:9901642 -> Gain: Socket 80 now has 1 / 3 child D:7:28 AM:9901643 -> prvSocketSetMSS: 1460 bytes for c0a80125ip:51148 D:7:28 AM:9901643 -> Socket 80 -> c0a80125ip:51148 State eCLOSED->eSYN_FIRST D:7:28 AM:9901644 -> Socket 80 -> c0a80125ip:51148 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9901644 -> Gain: Socket 80 now has 2 / 3 children D:7:28 AM:9901644 -> prvSocketSetMSS: 1460 bytes for c0a80125ip:51149 D:7:28 AM:9901644 -> Socket 80 -> c0a80125ip:51149 State eCLOSED->eSYN_FIRST D:7:28 AM:9901644 -> Socket 80 -> c0a80125ip:51149 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9901892 -> Gain: Socket 80 now has 3 / 3 children D:7:28 AM:9901892 -> prvSocketSetMSS: 1460 bytes for c0a80125ip:51150 D:7:28 AM:9901893 -> Socket 80 -> c0a80125ip:51150 State eCLOSED->eSYN_FIRST D:7:28 AM:9901893 -> Socket 80 -> c0a80125ip:51150 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9901930 -> xTCPCheckNewClient[0]: client on port 80 D:7:28 AM:9901931 -> Connection Using 1 D:7:28 AM:9901931 -> xTCPCheckNewClient[0]: client on port 80 D:7:28 AM:9901931 -> Connection Using 2 D:7:28 AM:9901931 -> Connection Using 3 D:7:28 AM:9904642 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9904642 -> Socket 80 -> c0a80125ip:51148 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9904643 -> Socket 80 -> c0a80125ip:51148 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9904643 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9904643 -> Socket 80 -> c0a80125ip:51149 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9904643 -> Socket 80 -> c0a80125ip:51149 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9904892 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9904892 -> Socket 80 -> c0a80125ip:51150 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9904892 -> Socket 80 -> c0a80125ip:51150 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9910642 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9910642 -> Socket 80 -> c0a80125ip:51148 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9910643 -> Socket 80 -> c0a80125ip:51148 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9910643 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9910643 -> Socket 80 -> c0a80125ip:51149 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9910643 -> Socket 80 -> c0a80125ip:51149 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9910892 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:7:28 AM:9910893 -> Socket 80 -> c0a80125ip:51150 State eSYNRECEIVED->eSYNFIRST D:7:28 AM:9910895 -> Socket 80 -> c0a80125ip:51150 State eSYNFIRST->eSYNRECEIVED D:7:28 AM:9912929 -> Killing stuck session 0 D:7:28 AM:9912930 -> Lost: Socket 80 now has 2 / 3 children D:7:28 AM:9912930 -> FreeRTOS_closesocket[80 to c0a80125ip:51148]: buffers 44 socks 3 D:7:28 AM:9912931 -> Closed Socket 1 D:7:28 AM:9912931 -> Killing stuck session 1 D:7:28 AM:9912931 -> Lost: Socket 80 now has 1 / 3 child D:7:28 AM:9912932 -> FreeRTOS_closesocket[80 to c0a80125ip:51149]: buffers 44 socks 2 D:7:28 AM:9912932 -> Closed Socket 2 D:7:28 AM:9912932 -> Killing stuck session 2 D:7:28 AM:9912932 -> Lost: Socket 80 now has 0 / 3 children D:7:28 AM:9912933 -> FreeRTOS_closesocket[80 to c0a80125ip:51150]: buffers 44 socks 1 D:7:28 AM:9912933 -> Closed Socket 3 ~~~ Have you seen this issue before? Are there any config settings that may be causing the issue. Thanks in advance for any comments. Joe

FreeRTOSIP-TCP Connection issue

You’re too quick. I’m just ready testing your earlier source code and now you’re posting +TCP logging. Please find attached a simple TCP server that uses Select(). I tested it on real hardware. What hardware platform are you using now, still a NXP K64? About the logging: did you also have a PCAP file from Wireshark, not only a print-screen?
Chrome does not like the connections
It seems to me that Chrome doesn’t receive any response at all, for some reason there is a one-way traffic. Strange though that Wireshark doesn see +TCP responses (SYN+ACK) ~~~~ /* Standard includes. */

include <stdint.h>

include <stdio.h>

/* FreeRTOS includes. */

include “FreeRTOS.h”

include “task.h”

include “semphr.h”

/* FreeRTOS+TCP includes. */

include “FreeRTOS_IP.h”

include “FreeRTOS_Sockets.h”

if( USEWIFISERVER != 0 )

static unsigned short ListenPort = 8008; static Socket_t xListenSocket;

define PRIORITYHTTPTASK 3

define STACKSIZEHTTP_TASK 340

extern void clearWDT (void); /* Should be called by each process */

define MAX_SESSIONS 4

define WS_HEADER 1

typedef struct xSesssion { Sockett S; } Sesssiont; #define WF_DataWasSentLookForComplete 1 static TaskHandle_t pxHTTPTask; static char pcBuffer[ 256 + 1 ]; static Sesssiont xSessions[ MAXSESSIONS ]; static SocketSet_t xSocketSet; void AcceptConnection() { struct freertossockaddr xAddress; socklent xAddressLength = ( socklent ) sizeof( xAddress ); BaseTypet xSessionNr;
Socket_t xSocket = FreeRTOS_accept( xListenSocket, &xAddress, &xAddressLength  );

FreeRTOS_printf( ( "FreeRTOS_accept returns %pn", xSocket ) );
if( xSocket != NULL )
{
UBaseType_t xReceiveTimeOut = 0ul;

    /* The call to FreeRTOS_recv() will be non-blocking. */
    FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );       
    for( xSessionNr = 0; xSessionNr < MAX_SESSIONS; xSessionNr++ )
    {
        if( xSessions[xSessionNr].S == FREERTOS_INVALID_SOCKET )
        {
            memset( xSessions + xSessionNr, 0, sizeof xSessions[ xSessionNr ] );
            xSessions[xSessionNr].S = xSocket;
            FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ | eSELECT_EXCEPT );
            break;
        }
    }
}
} void httpserver( void *pvParameters ) { UBaseTypet xReceiveTimeOut = pdMSTOTICKS( 5000ul ); BaseTypet xResult, xSessionNr; struct freertossockaddr serveraddr; UBaseTypet TimeoutActive = pdFALSE;
/* loop through list of open sessions looking for work */
for(xSessionNr = 0; xSessionNr < MAX_SESSIONS; xSessionNr++)
{
    xSessions[xSessionNr].S = FREERTOS_INVALID_SOCKET;
}

while(1)
{

        /* Create a TCP socket. */
    xListenSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP );
    if( xListenSocket != FREERTOS_INVALID_SOCKET )
    {
        break;
    }
TryAgain:
vTaskDelay( pdMSTOTICKS( 100 ) ); } /* Set a time out so accept() will just wait for a connection. */ FreeRTOS_setsockopt( xListenSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) );
memset(&server_addr, '', sizeof(server_addr));      
server_addr.sin_port = FreeRTOS_htons( ListenPort );
server_addr.sin_addr = FreeRTOS_GetIPAddress(); // Single NIC, currently not used

// Bind the address to the socket. 
if( FreeRTOS_bind( xListenSocket, &server_addr, sizeof( server_addr ) ) == -1 )
{
    FreeRTOS_closesocket( xListenSocket );
    xListenSocket = FREERTOS_INVALID_SOCKET;
    goto TryAgain;
}

FreeRTOS_printf( ("Socket created and Bind.n" ) );

while(1)
{
    xSocketSet = FreeRTOS_CreateSocketSet();
    if( xSocketSet )
    {
        break;
    }

    vTaskDelay( pdMS_TO_TICKS( 100 ) );
}

//Listen to incoming connections
xResult = FreeRTOS_listen( xListenSocket , MAX_SESSIONS );

// add listen to socket set 
FreeRTOS_FD_SET( xListenSocket, xSocketSet, eSELECT_READ );

//Accept and incoming connection
FreeRTOS_printf( ("Waiting for incoming connections... (xResult = %ld)n", xResult ) );

while(1)
{
    clearWDT ();

    /* See if any of the sockets have input or ready to send */
    /* Wait at most 10 seconds. */
    xResult = FreeRTOS_select( xSocketSet, ( pdMS_TO_TICKS( 10000 ) ) );    // Blocks until activity

    if(xResult < 0)
    {
    static BaseType_t xLastError;

        if( xLastError != xResult )
        {
            xLastError = xResult;
            FreeRTOS_printf( ("Select returns %ldn", xResult ) );
        }
    }
    else if( xResult > 0 )
    {
        FreeRTOS_printf( ("Select returns %ldn", xResult ) );
        // check if new read on listen
        if( ( FreeRTOS_FD_ISSET( xListenSocket, xSocketSet ) & eSELECT_READ ) != 0 )  // read on listen means new connection waiting
        {
            AcceptConnection();
        }
    }

    /* Work on the socket list. */
    for( xSessionNr = 0; xSessionNr < MAX_SESSIONS; xSessionNr++ )
    {
    Socket_t xSocket = xSessions[ xSessionNr ].S;

        if( xSocket != FREERTOS_INVALID_SOCKET )
        {
        BaseType_t xLength;

            xLength = FreeRTOS_recv( xSocket, pcBuffer, sizeof( pcBuffer ) - 1, 0L );

            if( xLength < 0 )
            {
                if( xLength != -pdFREERTOS_ERRNO_EAGAIN )
                {
                    FreeRTOS_printf( ("Connection lost, socket will be closed.n" ) );
                    FreeRTOS_FD_CLR( xSocket, xSocketSet, eSELECT_ALL );
                    FreeRTOS_closesocket( xSocket );
                    /* Mark as free. */
                    xSessions[ xSessionNr ].S = FREERTOS_INVALID_SOCKET;
                }
            }
            else if( xLength > 0 )
            {
                FreeRTOS_send( xSocket, pcBuffer, xLength, 0 );
            }
            break;
        }
    }
}
} void httpserverinstall() { if( pxHTTPTask == NULL ) { /* Call this function once to start the test with FreeRTOSaccept(). */ xTaskCreate( httpserver, “httpserver”, STACKSIZEHTTPTASK, NULL, PRIORITYHTTPTASK, &pxHTTPTask ); } }

endif /* USEWIFISERVER != 0 */

~~~~

FreeRTOSIP-TCP Connection issue

Yes I have a pcap file.

FreeRTOSIP-TCP Connection issue

I resolved the other issue We spoke about — see that post. In your example server above — what does function clearWDT (); do? It is missing from the code? Joe

FreeRTOSIP-TCP Connection issue

I’ve implemented you server above. Same connection issue. I have include pcap files for execution on Chrome and IE. Any IP config setting that could be related? I wrote the EMAC – driver. Any potential issue I caused there? The driver was running in another port — no issue. Here is a debug dump from YOUR web server. If you look at the pcap file, I still see a lot of re-transmissions. Do you see any behavior difference in my server and yours? The two Test_WS files are YOUR web server. Web Browser is 192.168.1.37 FreeRTOSIP is 192.168.1.12 Thanks. Joe Debug dump YOUR Server ~~~ D:9:47 AM:18280267 -> Gain: Socket 8008 now has 1 / 4 child D:9:47 AM:18280267 -> prvSocketSetMSS: 1460 bytes for c0a80125ip:52610 D:9:47 AM:18280268 -> Socket 8008 -> c0a80125ip:52610 State eCLOSED->eSYN_FIRST D:9:47 AM:18280268 -> Socket 8008 -> c0a80125ip:52610 State eSYNFIRST->eSYNRECEIVED D:9:47 AM:18283269 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:9:47 AM:18283270 -> Socket 8008 -> c0a80125ip:52610 State eSYNRECEIVED->eSYNFIRST D:9:47 AM:18283270 -> Socket 8008 -> c0a80125ip:52610 State eSYNFIRST->eSYNRECEIVED S:9:48 AM:18285955 -> Select returns 1 S:9:48 AM:18285955 -> FreeRTOS_accept returns 2000fda8 D:9:48 AM:18289264 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:9:48 AM:18289264 -> Socket 8008 -> c0a80125ip:52610 State eSYNRECEIVED->eSYNFIRST D:9:48 AM:18289264 -> Socket 8008 -> c0a80125ip:52610 State eSYNFIRST->eSYNRECEIVED D:9:48 AM:18301266 -> Gain: Socket 8008 now has 2 / 4 children D:9:48 AM:18301267 -> prvSocketSetMSS: 1460 bytes for c0a80125ip:52612 D:9:48 AM:18301267 -> Socket 8008 -> c0a80125ip:52612 State eCLOSED->eSYN_FIRST D:9:48 AM:18301267 -> Socket 8008 -> c0a80125ip:52612 State eSYNFIRST->eSYNRECEIVED D:9:48 AM:18304266 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:9:48 AM:18304266 -> Socket 8008 -> c0a80125ip:52612 State eSYNRECEIVED->eSYNFIRST D:9:48 AM:18304266 -> Socket 8008 -> c0a80125ip:52612 State eSYNFIRST->eSYNRECEIVED S:9:48 AM:18305955 -> Select returns 1 S:9:48 AM:18305955 -> FreeRTOS_accept returns 20010f68 D:9:48 AM:18310266 -> eSYN_RECEIVED: ACK expected, not SYN: peer missed our SYN+ACK D:9:48 AM:18310267 -> Socket 8008 -> c0a80125ip:52612 State eSYNRECEIVED->eSYNFIRST D:9:48 AM:18310267 -> Socket 8008 -> c0a80125ip:52612 State eSYNFIRST->eSYNRECEIVED ~~~

FreeRTOSIP-TCP Connection issue

Missed your question. Yes — still same NXP Kinetis K64 (Use to be FreeScale) Joe

FreeRTOSIP-TCP Connection issue

Hein: It just occurred to me, you might think this is about the Listening / Select issue I post about over the weekend. It’s NOT. I resolved that issue — I believe you folks have a CONFIG option issue that needs looking into. This is a Connection issue AFTER the listening has accepted the connection. Joe

FreeRTOSIP-TCP Connection issue

Hi Joe,
clearWDT ()
Sorry I left that in, it’s my Watch Dog Timer, every task must call it regularly. Your last logging shows the same: the client doesn’t seem to receive any TCP packets.
Yes I have a pcap file.
I still don’t the PCAP file attached? Normally when users are developing a EMAC / +TCP driver, they get in touch with us directly. This shortens the development time and it decreases frustrations. I already invited you to contact us 🙂 You can reach me as h point tibosch at freertos point org. There is already a port for K63F, but I’m not sure if that would help you? I’ve just posted a working example of the use of FreeRTOS_select() in this thread. I tested it with :
#define ipconfigTCP_HANG_PROTECTION        1
Have you tried it already? There is no known issue (yet) with the hang protection. It is normally used along with ipconfigTCP_KEEP_ALIVE, which causes ALIVE messages to be exchanged. Have you already tried the example HTTP server? ~~~~ FreeRTOS-Plus-TCPprotocolsHTTPFreeRTOSHTTPserver.c ~~~~ it also uses FreeRTOS_select() and I it is often used along with ipconfigTCP_HANG_PROTECTION. Regards, Hein

FreeRTOSIP-TCP Connection issue

Our posts keep on crossing each other… I’ll attach a PCAP of the communication that I just saw. It is sending three times “Hello world” to the server and disconnect. The logging shows this: ~~~~ 70.379 [10]: Select returns 1 70.380 [10]: FreeRTOS_accept returns d0233ec8 71.854 [10]: Select returns 1 72.894 [10]: Select returns 1 73.917 [10]: Select returns 1 75.015 [10]: Select returns 4 75.015 [10]: Connection lost, socket will be closed. ~~~~ Regards.

FreeRTOSIP-TCP Connection issue

Update: Issue is resolved. Stack GREAT!!. User had issue. I was too knowledable about stack and driver design that I read more into the porting requirements than what +TCP wanted. I am using bufferallocation1 which uses statically defined network buffers. When I designed the driver’s transmit function I assumed the return indicated if the networkbuffer was actually transmitted. If I did not have an empty xmit buffer slot, I returned FALSE back to the stack and DID NOT release the buffer. The stack thought the buffer was released and reused it, which happened to be a TCP reply to a client with the wrong port number. My client did NOT receive a proper connection SYN+ACK to the required port .. so it bailed. Hein was extreemly helpful in resolving the issue which was with my transmit driver. I now spin until the message can be transmitted and always release EVERY buffer … transmitted or not. Great help from Hein at FreeRTOS. Joe