OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /plasma/trunk
    from Rev 418 to Rev 419
    Reverse comparison

Rev 418 → Rev 419

/kernel/tcpip.c
210,7 → 210,7
uint32 state;
 
state = OS_CriticalBegin();
if(FrameFreeCount > freeCount)
if(FrameFreeCount >= freeCount)
{
frame = FrameFreeHead;
if(FrameFreeHead)
666,6 → 666,14
IPFrame *frameOut, *frame2, *framePrev;
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;
length = frameIn->length;
 
809,7 → 817,7
(packet[TCP_FLAGS] & (TCP_FLAGS_RST | TCP_FLAGS_FIN)) == 0 &&
socket->resentDone == 0)
{
//Detected that packet was lost, resend all
//Detected that packet was lost, resend
if(IPVerbose)
printf("A");
OS_MutexPend(IPMutex);
822,6 → 830,7
//Remove packet from retransmition queue
FrameRemove(&FrameResendHead, &FrameResendTail, framePrev);
IPSendFrame(framePrev);
break;
}
}
OS_MutexPost(IPMutex);
853,6 → 862,9
return 0;
}
 
if(frameIn->length > ip_length + IP_VERSION_LENGTH)
frameIn->length = (uint16)(ip_length + IP_VERSION_LENGTH);
 
//Check if RST flag set
if(packet[TCP_FLAGS] & TCP_FLAGS_RST)
{
868,11 → 880,45
socket->timeout = socket->timeoutReset;
if(IPVerbose)
printf("D");
if(frameIn->length > ip_length + IP_VERSION_LENGTH)
frameIn->length = (uint16)(ip_length + IP_VERSION_LENGTH);
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
socket->ack += bytes;
for(;;)
{
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
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
window = RECEIVE_WINDOW - (socket->ack - socket->ackProcessed);
frameOut = IPFrameGet(FRAME_COUNT_SEND);
887,6 → 933,13
}
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
frameOut = IPFrameGet(FRAME_COUNT_SEND);
if(frameOut)
897,7 → 950,7
}
 
//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;
socket->timeout = SOCKET_TIMEOUT;
1199,6 → 1252,8
socket->timeoutReset = SOCKET_TIMEOUT;
socket->frameReadHead = NULL;
socket->frameReadTail = NULL;
socket->frameFutureHead = NULL;
socket->frameFutureTail = NULL;
socket->readOffset = 0;
socket->funcPtr = funcPtr;
socket->userData = 0;
1346,7 → 1401,7
 
#ifndef EXCLUDE_FILESYS
if(socket->fileOut) //override stdout
return fwrite((char*)buf, 1, length, socket->fileOut);
return fwrite((char*)buf, 1, length, (FILE*)socket->fileOut);
#endif
//printf("IPWrite(0x%x, %d)", Socket, Length);
1433,11 → 1488,11
#ifndef EXCLUDE_FILESYS
if(socket->fileIn) //override stdin
{
bytes = fread(buf, 1, 1, socket->fileIn);
bytes = fread(buf, 1, 1, (FILE*)socket->fileIn);
if(bytes == 0)
{
buf[0] = 0;
fclose(socket->fileIn);
fclose((FILE*)socket->fileIn);
socket->fileIn = NULL;
bytes = 1;
}
1528,6 → 1583,15
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
socket->timeout = SOCKET_TIMEOUT;
socket->state = IP_CLOSED;
1688,7 → 1752,7
socket->userData = ipAddress;
if(socket->userFunc)
{
socket->userFunc(socket, socket->userPtr, ipAddress);
socket->userFunc(socket, (uint8*)socket->userPtr, ipAddress);
}
break;
}
/kernel/tcpip.h
13,7 → 13,7
#define __TCPIP_H__
#define PACKET_SIZE 600
#define FRAME_COUNT 100
#define FRAME_COUNT_SYNC 50
#define FRAME_COUNT_SYNC 15
#define FRAME_COUNT_SEND 10
#define FRAME_COUNT_RCV 5
#define RETRANSMIT_TIME 110
70,6 → 70,8
uint8 headerRcv[38];
struct IPFrame *frameReadHead;
struct IPFrame *frameReadTail;
struct IPFrame *frameFutureHead;
struct IPFrame *frameFutureTail;
int readOffset;
struct IPFrame *frameSend;
int sendOffset;
/kernel/netutil.c
59,6 → 59,7
unsigned char buf[600];
int bytes, state = socket->state;
FtpdInfo *info = (FtpdInfo*)socket->userPtr;
int total = 0;
 
if(info == NULL || info->done)
return;
66,9 → 67,10
{
bytes = IPRead(socket, buf, sizeof(buf));
fwrite(buf, 1, bytes, info->file);
total += bytes;
} while(bytes);
 
if(state > IP_TCP)
if(state > IP_TCP && total == 0)
{
fclose(info->file);
info->done = 1;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.