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

Subversion Repositories mlite

[/] [mlite/] [trunk/] [kernel/] [tcpip.c] - Diff between revs 220 and 225

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

Rev 220 Rev 225
Line 47... Line 47...
#define UartPacketConfig(A,B,C)
#define UartPacketConfig(A,B,C)
#define UartPacketSend(A,B)
#define UartPacketSend(A,B)
#define UartPrintf printf
#define UartPrintf printf
#define UartPrintfCritical printf
#define UartPrintfCritical printf
#define Led(A)
#define Led(A)
 
#define OS_Job(A,B,C,D) A(B,C,D)
#endif
#endif
 
 
//ETHER FIELD                 OFFSET   LENGTH   VALUE
//ETHER FIELD                 OFFSET   LENGTH   VALUE
#define ETHERNET_DEST         0        //6
#define ETHERNET_DEST         0        //6
#define ETHERNET_SOURCE       6        //6
#define ETHERNET_SOURCE       6        //6
Line 641... Line 642...
 
 
 
 
static int IPProcessTCPPacket(IPFrame *frameIn)
static int IPProcessTCPPacket(IPFrame *frameIn)
{
{
   uint32 seq, ack;
   uint32 seq, ack;
   int length, ip_length, bytes;
   int length, ip_length, bytes, rc=0;
   IPSocket *socket, *socketNew;
   IPSocket *socket, *socketNew;
   IPFrame *frameOut, *frame2, *framePrev;
   IPFrame *frameOut, *frame2, *framePrev;
   uint8 *packet, *packetOut;
   uint8 *packet, *packetOut;
 
 
   packet = frameIn->packet;
   packet = frameIn->packet;
Line 754... Line 755...
   if(socket == NULL)
   if(socket == NULL)
   {
   {
      return 0;
      return 0;
   }
   }
 
 
   //Check if FIN flag set
 
   if(packet[TCP_FLAGS] & TCP_FLAGS_FIN)
 
   {
 
      socket->timeout = SOCKET_TIMEOUT;
 
      if(IPVerbose)
 
         printf("F");
 
      frameOut = IPFrameGet(0);
 
      if(frameOut == NULL)
 
         return 0;
 
      packetOut = frameOut->packet;
 
      packetOut[TCP_FLAGS] = TCP_FLAGS_ACK;
 
      ++socket->ack;
 
      TCPSendPacket(socket, frameOut, TCP_DATA);
 
      if(socket->state == IP_FIN_SERVER)
 
         IPClose2(socket);
 
      else
 
      {
 
         socket->state = IP_FIN_CLIENT;
 
         if(socket->funcPtr)
 
            socket->funcPtr(socket);
 
      }
 
   }
 
   else if(packet[TCP_FLAGS] & TCP_FLAGS_RST)
 
   {
 
      if(socket->state == IP_FIN_SERVER)
 
         IPClose2(socket);
 
      else
 
      {
 
         socket->state = IP_FIN_CLIENT;
 
         if(socket->funcPtr)
 
            socket->funcPtr(socket);
 
      }
 
   }
 
   else
 
   {
 
      //Check if packets can be removed from retransmition list
      //Check if packets can be removed from retransmition list
 
   if(packet[TCP_FLAGS] & TCP_FLAGS_ACK)
 
   {
      if(ack != socket->seqReceived)
      if(ack != socket->seqReceived)
      {
      {
         OS_MutexPend(IPMutex);
         OS_MutexPend(IPMutex);
         for(frame2 = FrameResendHead; frame2; )
         for(frame2 = FrameResendHead; frame2; )
         {
         {
Line 809... Line 777...
            }
            }
         }
         }
         OS_MutexPost(IPMutex);
         OS_MutexPost(IPMutex);
         socket->seqReceived = ack;
         socket->seqReceived = ack;
      }
      }
 
   }
 
 
      bytes = ip_length - (TCP_DATA - IP_VERSION_LENGTH);
      bytes = ip_length - (TCP_DATA - IP_VERSION_LENGTH);
 
 
      //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 825... Line 794...
         {
         {
            frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
            frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
            TCPSendPacket(socket, frameOut, TCP_DATA);
            TCPSendPacket(socket, frameOut, TCP_DATA);
         }
         }
         if(socket->funcPtr)
         if(socket->funcPtr)
            socket->funcPtr(socket);
         OS_Job(socket->funcPtr, socket, 0, 0);
         return 0;
         return 0;
      }
      }
      else if(packet[TCP_HEADER_LENGTH] != 0x50)
   if(packet[TCP_HEADER_LENGTH] != 0x50)
      {
      {
         if(IPVerbose)
         if(IPVerbose)
            printf("length error\n");
            printf("length error\n");
         return 0;
         return 0;
      }
      }
Line 843... Line 812...
         //Insert packet into socket linked list
         //Insert packet into socket linked list
         if(socket->timeout)
         if(socket->timeout)
            socket->timeout = SOCKET_TIMEOUT;
            socket->timeout = SOCKET_TIMEOUT;
         if(IPVerbose)
         if(IPVerbose)
            printf("D");
            printf("D");
 
      if(frameIn->length > ip_length + IP_VERSION_LENGTH)
 
         frameIn->length = ip_length + IP_VERSION_LENGTH;
         FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
         FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
         socket->ack += bytes;
         socket->ack += bytes;
 
 
         //Ack data
         //Ack data
         frameOut = IPFrameGet(FRAME_COUNT_SEND);
         frameOut = IPFrameGet(FRAME_COUNT_SEND);
Line 859... Line 830...
         //Determine window
         //Determine window
         socket->seqWindow = (packet[TCP_WINDOW_SIZE] << 8) | packet[TCP_WINDOW_SIZE+1];
         socket->seqWindow = (packet[TCP_WINDOW_SIZE] << 8) | packet[TCP_WINDOW_SIZE+1];
         if(socket->seqWindow < 8)
         if(socket->seqWindow < 8)
            socket->seqWindow = 8;
            socket->seqWindow = 8;
 
 
         //Notify application
 
         if(socket->funcPtr)
 
            socket->funcPtr(socket);
 
         //Using frame
         //Using frame
         return 1;
      rc = 1;
      }
      }
 
   else if(bytes)
      if(bytes)
 
      {
      {
         //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);
         }
         }
      }
      }
      if(socket->funcPtr)
 
         socket->funcPtr(socket);
   //Check if FIN flag set
   }
   if(packet[TCP_FLAGS] & TCP_FLAGS_FIN)
 
   {
 
      socket->timeout = SOCKET_TIMEOUT;
 
      if(IPVerbose)
 
         printf("F");
 
      frameOut = IPFrameGet(0);
 
      if(frameOut == NULL)
   return 0;
   return 0;
 
      packetOut = frameOut->packet;
 
      packetOut[TCP_FLAGS] = TCP_FLAGS_ACK;
 
      ++socket->ack;
 
      TCPSendPacket(socket, frameOut, TCP_DATA);
 
      if(socket->state == IP_FIN_SERVER)
 
         IPClose2(socket);
 
      else
 
         socket->state = IP_FIN_CLIENT;
 
   }
 
 
 
   //Check if RST flag set
 
   if(packet[TCP_FLAGS] & TCP_FLAGS_RST)
 
   {
 
      if(socket->state == IP_FIN_SERVER)
 
         IPClose2(socket);
 
      else
 
         socket->state = IP_FIN_CLIENT;
 
   }
 
 
 
   //Notify application
 
   if(socket->funcPtr)
 
      OS_Job(socket->funcPtr, socket, 0, 0);
 
   return rc;
}
}
 
 
 
 
int IPProcessEthernetPacket(IPFrame *frameIn)
int IPProcessEthernetPacket(IPFrame *frameIn)
{
{
Line 967... Line 963...
         for(socket = SocketHead; socket; socket = socket->next)
         for(socket = SocketHead; socket; socket = socket->next)
         {
         {
            if(socket->state == IP_PING &&
            if(socket->state == IP_PING &&
               memcmp(packet+IP_SOURCE, socket->headerSend+IP_DEST, 4) == 0)
               memcmp(packet+IP_SOURCE, socket->headerSend+IP_DEST, 4) == 0)
            {
            {
               socket->funcPtr(socket);
               OS_Job(socket->funcPtr, socket, 0, 0);
               return 0;
               return 0;
            }
            }
         }
         }
      }
      }
      if(packet[PING_TYPE] != 8)
      if(packet[PING_TYPE] != 8)
Line 1023... Line 1019...
      if(socket)
      if(socket)
      {
      {
         if(IPVerbose)
         if(IPVerbose)
            printf("U");
            printf("U");
         FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
         FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn);
         socket->funcPtr(socket);
         OS_Job(socket->funcPtr, socket, 0, 0);
         return 1;
         return 1;
      }
      }
   }
   }
   return 0;
   return 0;
}
}
Line 1121... Line 1117...
      FrameFreeHead = frame;
      FrameFreeHead = frame;
   }
   }
   UartPacketConfig(MyPacketGet, PACKET_SIZE, IPMQueue);
   UartPacketConfig(MyPacketGet, PACKET_SIZE, IPMQueue);
   if(frameSendFunction == NULL)
   if(frameSendFunction == NULL)
      IPThread = OS_ThreadCreate("TCP/IP", IPMainThread, NULL, 240, 6000);
      IPThread = OS_ThreadCreate("TCP/IP", IPMainThread, NULL, 240, 6000);
 
 
   IPDhcp(NULL, 360, 1);        //Send DHCP request
   IPDhcp(NULL, 360, 1);        //Send DHCP request
}
}
 
 
 
 
//To open a socket for listen set ipAddress to 0
//To open a socket for listen set ipAddress to 0
Line 1353... Line 1348...
uint32 IPRead(IPSocket *socket, uint8 *buf, uint32 length)
uint32 IPRead(IPSocket *socket, uint8 *buf, uint32 length)
{
{
   IPFrame *frame, *frame2;
   IPFrame *frame, *frame2;
   int count=0, bytes, offset;
   int count=0, bytes, offset;
 
 
   if(socket->state == IP_TCP)
   if(socket->state == IP_UDP)
      offset = TCP_DATA;
 
   else
 
      offset = UDP_DATA;
      offset = UDP_DATA;
 
   else
 
      offset = TCP_DATA;
 
 
   OS_MutexPend(IPMutex);
   OS_MutexPend(IPMutex);
   for(frame = socket->frameReadTail; length && frame; )
   for(frame = socket->frameReadTail; length && frame; )
   {
   {
      bytes = frame->length - offset - socket->readOffset;
      bytes = frame->length - offset - socket->readOffset;
Line 1421... Line 1416...
      FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
      FrameRemove(&socket->frameReadHead, &socket->frameReadTail, framePrev);
      FrameFree(framePrev);
      FrameFree(framePrev);
   }
   }
 
 
   //Remove socket
   //Remove socket
 
   if(socket->state == IP_CLOSED)
 
   {
   if(socket->prev == NULL)
   if(socket->prev == NULL)
      SocketHead = socket->next;
      SocketHead = socket->next;
   else
   else
      socket->prev->next = socket->next;
      socket->prev->next = socket->next;
   if(socket->next)
   if(socket->next)
      socket->next->prev = socket->prev;
      socket->next->prev = socket->prev;
   free(socket);
   free(socket);
 
   }
 
   else
 
   {
 
      //Give application 10 seconds to stop using socket
 
      socket->state = IP_CLOSED;
 
      socket->timeout = 10;
 
   }
   OS_MutexPost(IPMutex);
   OS_MutexPost(IPMutex);
}
}
 
 
 
 
void IPClose(IPSocket *socket)
void IPClose(IPSocket *socket)
Line 1504... Line 1508...
      socket2 = socket;
      socket2 = socket;
      socket = socket->next;
      socket = socket->next;
      if(socket2->timeout && --socket2->timeout == 0)
      if(socket2->timeout && --socket2->timeout == 0)
      {
      {
         socket2->timeout = 10;
         socket2->timeout = 10;
         if(IPVerbose)
         if(IPVerbose && socket2->state != IP_CLOSED)
            printf("t(%d,%d)", socket2->state, FrameFreeCount);
            printf("t(%d,%d)", socket2->state, FrameFreeCount);
         if(socket2->state == IP_TCP)
         if(socket2->state == IP_TCP)
            IPClose(socket2);
            IPClose(socket2);
         else if(socket2->state == IP_FIN_CLIENT)
         else if(socket2->state == IP_FIN_CLIENT)
            IPClose(socket2);
            IPClose(socket2);

powered by: WebSVN 2.1.0

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