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

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [tcpip.c] - Diff between revs 418 and 419

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 418 Rev 419
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;
         }
         }
      }
      }
   }
   }

powered by: WebSVN 2.1.0

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