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

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [tcpip.c] - Diff between revs 420 and 423

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

Rev 420 Rev 423
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

powered by: WebSVN 2.1.0

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