FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [August 2016 Threads] FreeRTOSIP-TCP Connection issuePosted by joehinkle on August 9, 2016 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 issuePosted by heinbali01 on August 9, 2016 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
include
/* 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 %p\n", 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. */
FreeRTOSsetsockopt( xListenSocket,
0,
FREERTOSSO_RCVTIMEO,
&xReceiveTimeOut,
sizeof( xReceiveTimeOut ) );
memset(&server_addr, '\0', 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 %ld\n", xResult ) );
}
}
else if( xResult > 0 )
{
FreeRTOS_printf( ("Select returns %ld\n", 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 issuePosted by joehinkle on August 9, 2016
FreeRTOSIP-TCP Connection issuePosted by joehinkle on August 9, 2016 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 issuePosted by joehinkle on August 9, 2016 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 issuePosted by joehinkle on August 9, 2016 Missed your question.
Yes -- still same NXP Kinetis K64 (Use to be FreeScale)
Joe
FreeRTOSIP-TCP Connection issuePosted by joehinkle on August 9, 2016 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 issuePosted by heinbali01 on August 9, 2016 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 issuePosted by heinbali01 on August 9, 2016 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.
Attachmentstcp_echo.pcap (1400 bytes)
FreeRTOSIP-TCP Connection issuePosted by joehinkle on August 10, 2016 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
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|