Line 208... |
Line 208... |
{
|
{
|
IPFrame *frame=NULL;
|
IPFrame *frame=NULL;
|
uint32 state;
|
uint32 state;
|
|
|
state = OS_CriticalBegin();
|
state = OS_CriticalBegin();
|
if(FrameFreeCount > freeCount)
|
if(FrameFreeCount >= freeCount)
|
{
|
{
|
frame = FrameFreeHead;
|
frame = FrameFreeHead;
|
if(FrameFreeHead)
|
if(FrameFreeHead)
|
{
|
{
|
FrameFreeHead = FrameFreeHead->next;
|
FrameFreeHead = FrameFreeHead->next;
|
Line 664... |
Line 664... |
int length, ip_length, bytes, rc=0, notify=0, window;
|
int length, ip_length, bytes, rc=0, notify=0, window;
|
IPSocket *socket, *socketNew;
|
IPSocket *socket, *socketNew;
|
IPFrame *frameOut, *frame2, *framePrev;
|
IPFrame *frameOut, *frame2, *framePrev;
|
uint8 *packet, *packetOut;
|
uint8 *packet, *packetOut;
|
|
|
|
#if 0
|
|
//Test missing packets
|
|
extern void __stdcall Sleep(unsigned long value);
|
|
Sleep(1);
|
|
if(rand() % 13 == 0)
|
|
return 0;
|
|
#endif
|
|
|
packet = frameIn->packet;
|
packet = frameIn->packet;
|
length = frameIn->length;
|
length = frameIn->length;
|
|
|
ip_length = (packet[IP_LENGTH] << 8) | packet[IP_LENGTH+1];
|
ip_length = (packet[IP_LENGTH] << 8) | packet[IP_LENGTH+1];
|
seq = (packet[TCP_SEQ] << 24) | (packet[TCP_SEQ+1] << 16) |
|
seq = (packet[TCP_SEQ] << 24) | (packet[TCP_SEQ+1] << 16) |
|
Line 807... |
Line 815... |
}
|
}
|
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)
|
socket->resentDone == 0)
|
{
|
{
|
//Detected that packet was lost, resend all
|
//Detected that packet was lost, resend
|
if(IPVerbose)
|
if(IPVerbose)
|
printf("A");
|
printf("A");
|
OS_MutexPend(IPMutex);
|
OS_MutexPend(IPMutex);
|
for(frame2 = FrameResendHead; frame2; )
|
for(frame2 = FrameResendHead; frame2; )
|
{
|
{
|
Line 820... |
Line 828... |
if(framePrev->socket == socket)
|
if(framePrev->socket == socket)
|
{
|
{
|
//Remove packet from retransmition queue
|
//Remove packet from retransmition queue
|
FrameRemove(&FrameResendHead, &FrameResendTail, framePrev);
|
FrameRemove(&FrameResendHead, &FrameResendTail, framePrev);
|
IPSendFrame(framePrev);
|
IPSendFrame(framePrev);
|
|
break;
|
}
|
}
|
}
|
}
|
OS_MutexPost(IPMutex);
|
OS_MutexPost(IPMutex);
|
socket->resentDone = 1;
|
socket->resentDone = 1;
|
}
|
}
|
Line 851... |
Line 860... |
if(IPVerbose)
|
if(IPVerbose)
|
printf("length error\n");
|
printf("length error\n");
|
return 0;
|
return 0;
|
}
|
}
|
|
|
|
if(frameIn->length > ip_length + IP_VERSION_LENGTH)
|
|
frameIn->length = (uint16)(ip_length + IP_VERSION_LENGTH);
|
|
|
//Check if RST flag set
|
//Check if RST flag set
|
if(packet[TCP_FLAGS] & TCP_FLAGS_RST)
|
if(packet[TCP_FLAGS] & TCP_FLAGS_RST)
|
{
|
{
|
notify = 1;
|
notify = 1;
|
IPClose2(socket);
|
IPClose2(socket);
|
Line 866... |
Line 878... |
notify = 1;
|
notify = 1;
|
if(socket->timeout)
|
if(socket->timeout)
|
socket->timeout = socket->timeoutReset;
|
socket->timeout = socket->timeoutReset;
|
if(IPVerbose)
|
if(IPVerbose)
|
printf("D");
|
printf("D");
|
if(frameIn->length > ip_length + IP_VERSION_LENGTH)
|
for(;;)
|
frameIn->length = (uint16)(ip_length + IP_VERSION_LENGTH);
|
{
|
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
|
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
|
socket->ack += bytes;
|
socket->ack += bytes;
|
|
|
|
//Check if any frameFuture packets match the seq
|
|
for(;;)
|
|
{
|
|
frame2 = socket->frameFutureTail;
|
|
if(frame2 == NULL)
|
|
break;
|
|
packet = frame2->packet;
|
|
seq = (packet[TCP_SEQ] << 24) | (packet[TCP_SEQ+1] << 16) |
|
|
(packet[TCP_SEQ+2] << 8) | packet[TCP_SEQ+3];
|
|
if(socket->ack > seq)
|
|
{
|
|
FrameRemove(&socket->frameFutureHead, &socket->frameFutureTail, frame2);
|
|
FrameFree(frame2);
|
|
}
|
|
else if(socket->ack == seq)
|
|
{
|
|
FrameRemove(&socket->frameFutureHead, &socket->frameFutureTail, frame2);
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
frame2 = NULL;
|
|
break;
|
|
}
|
|
}
|
|
if(frame2 == NULL)
|
|
break;
|
|
ip_length = (packet[IP_LENGTH] << 8) | packet[IP_LENGTH+1];
|
|
bytes = ip_length - (TCP_DATA - IP_VERSION_LENGTH);
|
|
frameIn = frame2;
|
|
if(IPVerbose)
|
|
printf("d");
|
|
}
|
|
|
//Ack data
|
//Ack data
|
window = RECEIVE_WINDOW - (socket->ack - socket->ackProcessed);
|
window = RECEIVE_WINDOW - (socket->ack - socket->ackProcessed);
|
frameOut = IPFrameGet(FRAME_COUNT_SEND);
|
frameOut = IPFrameGet(FRAME_COUNT_SEND);
|
if(frameOut)
|
if(frameOut)
|
{
|
{
|
Line 885... |
Line 931... |
//Using frame
|
//Using frame
|
rc = 1;
|
rc = 1;
|
}
|
}
|
else if(bytes)
|
else if(bytes)
|
{
|
{
|
|
if(socket->ack < seq && seq <= socket->ack + 65536)
|
|
{
|
|
//Save frame to frameFuture
|
|
FrameInsert(&socket->frameFutureHead, &socket->frameFutureTail, frameIn);
|
|
rc = 1; //using frame
|
|
}
|
|
|
//Ack with current offset since data missing
|
//Ack with current offset since data missing
|
frameOut = IPFrameGet(FRAME_COUNT_SEND);
|
frameOut = IPFrameGet(FRAME_COUNT_SEND);
|
if(frameOut)
|
if(frameOut)
|
{
|
{
|
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
|
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
|
TCPSendPacket(socket, frameOut, TCP_DATA);
|
TCPSendPacket(socket, frameOut, TCP_DATA);
|
}
|
}
|
}
|
}
|
|
|
//Check if FIN flag set
|
//Check if FIN flag set
|
if(packet[TCP_FLAGS] & TCP_FLAGS_FIN && socket->ack >= seq)
|
if((packet[TCP_FLAGS] & TCP_FLAGS_FIN) && socket->ack >= seq)
|
{
|
{
|
notify = 1;
|
notify = 1;
|
socket->timeout = SOCKET_TIMEOUT;
|
socket->timeout = SOCKET_TIMEOUT;
|
if(IPVerbose)
|
if(IPVerbose)
|
printf("F");
|
printf("F");
|
Line 1197... |
Line 1250... |
socket->state = IP_LISTEN;
|
socket->state = IP_LISTEN;
|
socket->timeout = 0;
|
socket->timeout = 0;
|
socket->timeoutReset = SOCKET_TIMEOUT;
|
socket->timeoutReset = SOCKET_TIMEOUT;
|
socket->frameReadHead = NULL;
|
socket->frameReadHead = NULL;
|
socket->frameReadTail = NULL;
|
socket->frameReadTail = NULL;
|
|
socket->frameFutureHead = NULL;
|
|
socket->frameFutureTail = NULL;
|
socket->readOffset = 0;
|
socket->readOffset = 0;
|
socket->funcPtr = funcPtr;
|
socket->funcPtr = funcPtr;
|
socket->userData = 0;
|
socket->userData = 0;
|
socket->userFunc = NULL;
|
socket->userFunc = NULL;
|
socket->userPtr = NULL;
|
socket->userPtr = NULL;
|
Line 1344... |
Line 1399... |
if(socket->timeout)
|
if(socket->timeout)
|
socket->timeout = socket->timeoutReset;
|
socket->timeout = socket->timeoutReset;
|
|
|
#ifndef EXCLUDE_FILESYS
|
#ifndef EXCLUDE_FILESYS
|
if(socket->fileOut) //override stdout
|
if(socket->fileOut) //override stdout
|
return fwrite((char*)buf, 1, length, socket->fileOut);
|
return fwrite((char*)buf, 1, length, (FILE*)socket->fileOut);
|
#endif
|
#endif
|
|
|
//printf("IPWrite(0x%x, %d)", Socket, Length);
|
//printf("IPWrite(0x%x, %d)", Socket, Length);
|
self = OS_ThreadSelf();
|
self = OS_ThreadSelf();
|
while(length)
|
while(length)
|
Line 1431... |
Line 1486... |
socket = (IPSocket*)OS_ThreadInfoGet(OS_ThreadSelf(), 0);
|
socket = (IPSocket*)OS_ThreadInfoGet(OS_ThreadSelf(), 0);
|
|
|
#ifndef EXCLUDE_FILESYS
|
#ifndef EXCLUDE_FILESYS
|
if(socket->fileIn) //override stdin
|
if(socket->fileIn) //override stdin
|
{
|
{
|
bytes = fread(buf, 1, 1, socket->fileIn);
|
bytes = fread(buf, 1, 1, (FILE*)socket->fileIn);
|
if(bytes == 0)
|
if(bytes == 0)
|
{
|
{
|
buf[0] = 0;
|
buf[0] = 0;
|
fclose(socket->fileIn);
|
fclose((FILE*)socket->fileIn);
|
socket->fileIn = NULL;
|
socket->fileIn = NULL;
|
bytes = 1;
|
bytes = 1;
|
}
|
}
|
return bytes;
|
return bytes;
|
}
|
}
|
Line 1526... |
Line 1581... |
frame = frame->next;
|
frame = frame->next;
|
FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
|
FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
|
FrameFree(framePrev);
|
FrameFree(framePrev);
|
}
|
}
|
|
|
|
//Remove packets from socket future linked list
|
|
for(frame = socket->frameFutureHead; frame; )
|
|
{
|
|
framePrev = frame;
|
|
frame = frame->next;
|
|
FrameRemove(&socket->frameFutureHead, &socket->frameFutureTail, framePrev);
|
|
FrameFree(framePrev);
|
|
}
|
|
|
//Give application time to stop using socket
|
//Give application time to stop using socket
|
socket->timeout = SOCKET_TIMEOUT;
|
socket->timeout = SOCKET_TIMEOUT;
|
socket->state = IP_CLOSED;
|
socket->state = IP_CLOSED;
|
|
|
OS_MutexPost(IPMutex);
|
OS_MutexPost(IPMutex);
|
Line 1686... |
Line 1750... |
ipAddress = (ptr[10] << 24) | (ptr[11] << 16) | (ptr[12] << 8) | ptr[13];
|
ipAddress = (ptr[10] << 24) | (ptr[11] << 16) | (ptr[12] << 8) | ptr[13];
|
printf("ipAddress = %d.%d.%d.%d\n", ptr[10], ptr[11], ptr[12], ptr[13]);
|
printf("ipAddress = %d.%d.%d.%d\n", ptr[10], ptr[11], ptr[12], ptr[13]);
|
socket->userData = ipAddress;
|
socket->userData = ipAddress;
|
if(socket->userFunc)
|
if(socket->userFunc)
|
{
|
{
|
socket->userFunc(socket, socket->userPtr, ipAddress);
|
socket->userFunc(socket, (uint8*)socket->userPtr, ipAddress);
|
}
|
}
|
break;
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|