Line 351... |
Line 351... |
int length;
|
int length;
|
length = frame->length - TCP_DATA;
|
length = frame->length - TCP_DATA;
|
if(frame->packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_SYN))
|
if(frame->packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_SYN))
|
++length;
|
++length;
|
if(frame->socket == NULL || frame->socket->state == IP_UDP || length == 0 ||
|
if(frame->socket == NULL || frame->socket->state == IP_UDP || length == 0 ||
|
frame->socket->state == IP_PING || ++frame->retryCnt > 4)
|
frame->socket->state == IP_PING || ++frame->retryCnt > 5)
|
{
|
{
|
FrameFree(frame); //can't be ACK'ed
|
FrameFree(frame); //can't be ACK'ed
|
}
|
}
|
#ifdef WIN32
|
#ifdef WIN32
|
else if(FrameFreeCount < FRAME_COUNT_SYNC)
|
else if(FrameFreeCount < FRAME_COUNT_SYNC)
|
Line 659... |
Line 659... |
|
|
|
|
static int IPProcessTCPPacket(IPFrame *frameIn)
|
static int IPProcessTCPPacket(IPFrame *frameIn)
|
{
|
{
|
uint32 seq, ack;
|
uint32 seq, ack;
|
int length, ip_length, bytes, rc=0, notify=0, window;
|
int length, ip_length, bytes, rc=0, notify=0, window, show;
|
IPSocket *socket, *socketNew;
|
IPSocket *socket, *socketNew;
|
IPFrame *frameOut, *frame2, *framePrev;
|
IPFrame *frameOut, *frame2, *framePrev;
|
uint8 *packet, *packetOut;
|
uint8 *packet, *packetOut;
|
|
|
#if 0
|
#if 0
|
Line 812... |
Line 812... |
OS_MutexPost(IPMutex);
|
OS_MutexPost(IPMutex);
|
socket->seqReceived = ack;
|
socket->seqReceived = ack;
|
socket->resentDone = 0;
|
socket->resentDone = 0;
|
}
|
}
|
else if(ack == socket->seqReceived && bytes == 0 &&
|
else if(ack == socket->seqReceived && bytes == 0 &&
|
(packet[TCP_FLAGS] & (TCP_FLAGS_RST | TCP_FLAGS_FIN)) == 0 &&
|
(packet[TCP_FLAGS] & (TCP_FLAGS_RST | TCP_FLAGS_FIN)) == 0)
|
socket->resentDone == 0)
|
|
{
|
{
|
//Detected that packet was lost, resend
|
//Detected that packet was lost, resend
|
if(IPVerbose)
|
show = 1;
|
printf("A");
|
|
OS_MutexPend(IPMutex);
|
OS_MutexPend(IPMutex);
|
for(frame2 = FrameResendHead; frame2; )
|
for(frame2 = FrameResendTail; frame2; )
|
{
|
{
|
framePrev = frame2;
|
framePrev = frame2->prev;
|
frame2 = frame2->next;
|
if(frame2->socket == socket)
|
if(framePrev->socket == socket)
|
|
{
|
{
|
|
if(frame2->retryCnt > 2)
|
|
break;
|
|
if(IPVerbose && show)
|
|
printf("R");
|
|
show = 0;
|
//Remove packet from retransmition queue
|
//Remove packet from retransmition queue
|
FrameRemove(&FrameResendHead, &FrameResendTail, framePrev);
|
FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
|
IPSendFrame(framePrev);
|
IPSendFrame(frame2);
|
|
//break;
|
}
|
}
|
|
frame2 = framePrev;
|
}
|
}
|
OS_MutexPost(IPMutex);
|
OS_MutexPost(IPMutex);
|
socket->resentDone = 1;
|
|
}
|
}
|
}
|
}
|
|
|
//Check if SYN/ACK
|
//Check if SYN/ACK
|
if((packet[TCP_FLAGS] & (TCP_FLAGS_SYN | TCP_FLAGS_ACK)) ==
|
if((packet[TCP_FLAGS] & (TCP_FLAGS_SYN | TCP_FLAGS_ACK)) ==
|
Line 1672... |
Line 1675... |
}
|
}
|
|
|
OS_MutexPend(IPMutex);
|
OS_MutexPend(IPMutex);
|
|
|
//Retransmit timeout packets
|
//Retransmit timeout packets
|
for(frame = FrameResendHead; frame; )
|
for(frame = FrameResendTail; frame; )
|
{
|
{
|
frame2 = frame;
|
frame2 = frame->prev;
|
frame = frame->next;
|
frame->timeout = (short)(frame->timeout - (ticks - ticksPrev2));
|
frame2->timeout = (short)(frame2->timeout - (ticks - ticksPrev2));
|
if(--frame->timeout <= 0)
|
if(--frame2->timeout <= 0)
|
|
{
|
{
|
if(IPVerbose)
|
if(IPVerbose)
|
printf("r" /*"(%x,%x,%d,%d,%d)"*/, (int)frame2, (int)frame2->socket,
|
printf("r" /*"(%x,%x,%d,%d,%d)"*/, (int)frame, (int)frame->socket,
|
frame2->retryCnt, frame2->length - TCP_DATA,
|
frame->retryCnt, frame->length - TCP_DATA,
|
frame2->socket->state);
|
frame->socket->state);
|
FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
|
FrameRemove(&FrameResendHead, &FrameResendTail, frame);
|
if(frame2->retryCnt < 4 && frame2->socket->state < IP_CLOSED)
|
if(frame->retryCnt < 5 && frame->socket->state < IP_CLOSED)
|
IPSendFrame(frame2);
|
IPSendFrame(frame);
|
else
|
else
|
{
|
{
|
if(frame2->socket->state == IP_TCP)
|
if(frame->socket->state == IP_TCP)
|
IPClose(frame2->socket);
|
IPClose(frame->socket);
|
FrameFree(frame2);
|
FrameFree(frame);
|
}
|
}
|
}
|
}
|
|
frame = frame2;
|
}
|
}
|
|
|
if(ticks - ticksPrev >= 95)
|
if(ticks - ticksPrev >= 95)
|
{
|
{
|
//Close timed out sockets
|
//Close timed out sockets
|