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

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [tcpip.c] - Diff between revs 368 and 372

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

Rev 368 Rev 372
Line 260... Line 260...
 
 
 
 
static void FrameRemove(IPFrame **head, IPFrame **tail, IPFrame *frame)
static void FrameRemove(IPFrame **head, IPFrame **tail, IPFrame *frame)
{
{
   assert(frame->state == 2);
   assert(frame->state == 2);
 
   if(frame->state != 2)
 
   {
 
      printf("frame->state=%d\n", frame->state);
 
      return;
 
   }
   frame->state = 1;
   frame->state = 1;
   if(frame->prev)
   if(frame->prev)
      frame->prev->next = frame->next;
      frame->prev->next = frame->next;
   else
   else
      *head = frame->next;
      *head = frame->next;
Line 1291... Line 1296...
   uint8 *packetOut;
   uint8 *packetOut;
   uint32 bytes, count=0, tries=0;
   uint32 bytes, count=0, tries=0;
   int offset;
   int offset;
   OS_Thread_t *self;
   OS_Thread_t *self;
 
 
 
   if(socket->state > IP_TCP)
 
      return 0;
 
 
   if(socket->timeout)
   if(socket->timeout)
      socket->timeout = socket->timeoutReset;
      socket->timeout = socket->timeoutReset;
 
 
#ifdef INCLUDE_FILESYS
#ifdef INCLUDE_FILESYS
   if(socket->fileOut)   //override stdout
   if(socket->fileOut)   //override stdout
Line 1438... Line 1446...
 
 
static void IPClose2(IPSocket *socket)
static void IPClose2(IPSocket *socket)
{
{
   IPFrame *frame, *framePrev;
   IPFrame *frame, *framePrev;
 
 
 
   //printf("IPClose2(%x) ", (int)socket);
 
 
   OS_MutexPend(IPMutex);
   OS_MutexPend(IPMutex);
 
 
   //Mark packets as don't retransmit
   //Remove pending packets
   for(frame = FrameSendHead; frame; frame = frame->next)
   for(frame = FrameSendHead; frame; )
   {
   {
      if(frame->socket == socket)
      framePrev = frame;
         frame->socket = NULL;
      frame = frame->next;
 
      if(framePrev->socket == socket)
 
      {
 
         FrameRemove(&FrameResendHead, &FrameResendTail, framePrev);
 
         FrameFree(framePrev);
 
      }
   }
   }
 
 
   //Remove packets from retransmision list
   //Remove packets from retransmision list
   for(frame = FrameResendHead; frame; )
   for(frame = FrameResendHead; frame; )
   {
   {
Line 1468... Line 1483...
      frame = frame->next;
      frame = frame->next;
      FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
      FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
      FrameFree(framePrev);
      FrameFree(framePrev);
   }
   }
 
 
   //Remove socket
   //Give application 30 seconds to stop using socket
   if(socket->state == IP_CLOSED || socket->state <= IP_UDP)
   socket->timeout = 30;
   {
 
      if(socket->prev == NULL)
 
         SocketHead = socket->next;
 
      else
 
         socket->prev->next = socket->next;
 
      if(socket->next)
 
         socket->next->prev = socket->prev;
 
      free(socket);
 
   }
 
   else
 
   {
 
      //Give application 10 seconds to stop using socket
 
      if(socket->state > IP_UDP)
 
         socket->state = IP_CLOSED;
         socket->state = IP_CLOSED;
      socket->timeout = 10;
 
   }
 
   OS_MutexPost(IPMutex);
   OS_MutexPost(IPMutex);
}
}
 
 
 
 
void IPClose(IPSocket *socket)
void IPClose(IPSocket *socket)
{
{
   IPFrame *frameOut;
   IPFrame *frameOut;
 
 
 
   //printf("IPClose(%x) ", (int)socket);
 
 
   IPWriteFlush(socket);
   IPWriteFlush(socket);
   if(socket->state <= IP_UDP)
   if(socket->state <= IP_UDP)
   {
   {
      IPClose2(socket);
      IPClose2(socket);
      return;
      return;
Line 1509... Line 1512...
   TCPSendPacket(socket, frameOut, TCP_DATA);
   TCPSendPacket(socket, frameOut, TCP_DATA);
   ++socket->seq;
   ++socket->seq;
   if(socket->state == IP_FIN_CLIENT)
   if(socket->state == IP_FIN_CLIENT)
      IPClose2(socket);
      IPClose2(socket);
   else
   else
 
   {
 
      socket->timeout = 20;
      socket->state = IP_FIN_SERVER;
      socket->state = IP_FIN_SERVER;
}
}
 
}
 
 
 
 
void IPPrintf(IPSocket *socket, char *message,
void IPPrintf(IPSocket *socket, char *message,
              int arg0, int arg1, int arg2, int arg3)
              int arg0, int arg1, int arg2, int arg3)
{
{
Line 1570... Line 1576...
      frame = frame->next;
      frame = frame->next;
      frame2->timeout = (short)(frame2->timeout - (ticks - ticksPrev2));
      frame2->timeout = (short)(frame2->timeout - (ticks - ticksPrev2));
      if(--frame2->timeout <= 0)
      if(--frame2->timeout <= 0)
      {
      {
         if(IPVerbose)
         if(IPVerbose)
            printf("r");
            printf("r" /*"(%x,%d,%d,%d)"*/, (int)frame2->socket, frame2->retryCnt,
 
               frame2->length - TCP_DATA, FrameFreeCount);
         FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
         FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
 
         if(frame2->retryCnt < 4 && frame2->socket->state < IP_FIN_SERVER)
         IPSendFrame(frame2);
         IPSendFrame(frame2);
 
         else
 
         {
 
            if(frame2->socket->state == IP_TCP)
 
               IPClose(frame2->socket);
 
            FrameFree(frame2);
 
         }
      }
      }
   }
   }
 
 
   if(ticks - ticksPrev >= 95)
   if(ticks - ticksPrev >= 95)
   {
   {
Line 1585... Line 1599...
      {
      {
         socket2 = socket;
         socket2 = socket;
         socket = socket->next;
         socket = socket->next;
         if(socket2->timeout && --socket2->timeout == 0)
         if(socket2->timeout && --socket2->timeout == 0)
         {
         {
 
            if(socket2->state == IP_CLOSED)
 
            {
 
               if(socket->prev == NULL)
 
                  SocketHead = socket->next;
 
               else
 
                  socket->prev->next = socket->next;
 
               if(socket->next)
 
                  socket->next->prev = socket->prev;
 
               //printf("freeSocket(%x) ", (int)socket);
 
               free(socket);
 
            }
 
            else
 
            {
            socket2->timeout = 10;
            socket2->timeout = 10;
            if(IPVerbose && socket2->state != IP_CLOSED &&
               if(IPVerbose)
                            socket2->state != IP_FIN_SERVER)
 
               printf("t(%d,%d)", socket2->state, FrameFreeCount);
               printf("t(%d,%d)", socket2->state, FrameFreeCount);
            if(socket2->state == IP_TCP)
               if(socket2->state == IP_TCP || socket2->state == IP_FIN_CLIENT)
               IPClose(socket2);
 
            else if(socket2->state == IP_FIN_CLIENT)
 
               IPClose(socket2);
               IPClose(socket2);
            else
            else
               IPClose2(socket2);
               IPClose2(socket2);
         }
         }
      }
      }
 
      }
      ticksPrev = ticks;
      ticksPrev = ticks;
   }
   }
   OS_MutexPost(IPMutex);
   OS_MutexPost(IPMutex);
   ticksPrev2 = ticks;
   ticksPrev2 = ticks;
}
}

powered by: WebSVN 2.1.0

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