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

Subversion Repositories mlite

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

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

Rev 211 Rev 220
Line 417... Line 417...
      packet[IP_LENGTH+1] = (uint8)length2;
      packet[IP_LENGTH+1] = (uint8)length2;
      memset(packet+IP_CHECKSUM, 0, 2);
      memset(packet+IP_CHECKSUM, 0, 2);
      checksum = IPChecksum(0xffff, packet+IP_VERSION_LENGTH, 20);
      checksum = IPChecksum(0xffff, packet+IP_VERSION_LENGTH, 20);
      packet[IP_CHECKSUM] = (unsigned char)(checksum >> 8);
      packet[IP_CHECKSUM] = (unsigned char)(checksum >> 8);
      packet[IP_CHECKSUM+1] = (unsigned char)checksum;
      packet[IP_CHECKSUM+1] = (unsigned char)checksum;
      if(packet[IP_PROTOCOL] == 0x01)         //PING
      if(packet[IP_PROTOCOL] == 0x01)         //ICMP & PING
      {
      {
         memset(packet+PING_CHECKSUM, 0, 2);
         memset(packet+PING_CHECKSUM, 0, 2);
         checksum = IPChecksum(0xffff, packet+PING_TYPE, length-PING_TYPE);
         checksum = IPChecksum(0xffff, packet+PING_TYPE, length-PING_TYPE);
         packet[PING_CHECKSUM] = (unsigned char)(checksum >> 8);
         packet[PING_CHECKSUM] = (unsigned char)(checksum >> 8);
         packet[PING_CHECKSUM+1] = (unsigned char)checksum;
         packet[PING_CHECKSUM+1] = (unsigned char)checksum;
Line 478... Line 478...
   uint8 *packet = frame->packet;
   uint8 *packet = frame->packet;
   int flags, count;
   int flags, count;
 
 
   flags = packet[TCP_FLAGS];
   flags = packet[TCP_FLAGS];
   memcpy(packet, socket->headerSend, TCP_SEQ);
   memcpy(packet, socket->headerSend, TCP_SEQ);
   packet[TCP_FLAGS] = (uint8)flags | (socket->headerSend[TCP_FLAGS] & TCP_FLAGS_PSH);
   packet[TCP_FLAGS] = (uint8)flags;
   if(flags & TCP_FLAGS_SYN)
   if(flags & TCP_FLAGS_SYN)
      packet[TCP_HEADER_LENGTH] = 0x60;  //set maximum segment size
      packet[TCP_HEADER_LENGTH] = 0x60;  //set maximum segment size
   else
   else
      packet[TCP_HEADER_LENGTH] = 0x50;
      packet[TCP_HEADER_LENGTH] = 0x50;
   packet[TCP_SEQ]   = (uint8)(socket->seq >> 24);
   packet[TCP_SEQ]   = (uint8)(socket->seq >> 24);
Line 720... Line 720...
            SocketHead = socketNew;
            SocketHead = socketNew;
            OS_MutexPost(IPMutex);
            OS_MutexPost(IPMutex);
            return 0;
            return 0;
         }
         }
      }
      }
 
 
 
      //Send reset
 
      frameOut = IPFrameGet(0);
 
      if(frameOut == NULL)
 
         return 0;
 
      packetOut = frameOut->packet;
 
      EthernetCreateResponse(packetOut, packet, TCP_DATA);
 
      memset(packetOut+TCP_SEQ, 0, 4);
 
      ++seq;
 
      packetOut[TCP_ACK]   = (uint8)(seq >> 24);
 
      packetOut[TCP_ACK+1] = (uint8)(seq >> 16);
 
      packetOut[TCP_ACK+2] = (uint8)(seq >> 8);
 
      packetOut[TCP_ACK+3] = (uint8)seq;
 
      packetOut[TCP_HEADER_LENGTH] = 0x50;
 
      packetOut[TCP_FLAGS] = TCP_FLAGS_RST;
 
      IPSendPacket(NULL, frameOut, TCP_DATA);
      return 0;
      return 0;
   }
   }
 
 
   //Find an open socket
   //Find an open socket
   for(socket = SocketHead; socket; socket = socket->next)
   for(socket = SocketHead; socket; socket = socket->next)
Line 734... Line 750...
      {
      {
         break;
         break;
      }
      }
   }
   }
   if(socket == NULL)
   if(socket == NULL)
 
   {
      return 0;
      return 0;
 
   }
 
 
   //Check if FIN flag set
   //Check if FIN flag set
   if(packet[TCP_FLAGS] & TCP_FLAGS_FIN)
   if(packet[TCP_FLAGS] & TCP_FLAGS_FIN)
   {
   {
      socket->timeout = SOCKET_TIMEOUT;
      socket->timeout = SOCKET_TIMEOUT;
Line 1013... Line 1031...
   }
   }
   return 0;
   return 0;
}
}
 
 
 
 
 
#ifndef WIN32
static void IPMainThread(void *arg)
static void IPMainThread(void *arg)
{
{
   uint32 message[4];
   uint32 message[4];
   int rc;
   int rc;
   IPFrame *frame, *frameOut=NULL;
   IPFrame *frame, *frameOut=NULL;
Line 1073... Line 1092...
         IPTick();
         IPTick();
         ticksLast = ticks;
         ticksLast = ticks;
      }
      }
   }
   }
}
}
 
#endif
 
 
 
 
uint8 *MyPacketGet(void)
uint8 *MyPacketGet(void)
{
{
   return (uint8*)IPFrameGet(FRAME_COUNT_RCV);
   return (uint8*)IPFrameGet(FRAME_COUNT_RCV);
Line 1238... Line 1258...
   uint8 *packetOut;
   uint8 *packetOut;
   if(socket->frameSend && socket->state != IP_UDP &&
   if(socket->frameSend && socket->state != IP_UDP &&
      socket->state != IP_PING)
      socket->state != IP_PING)
   {
   {
      packetOut = socket->frameSend->packet;
      packetOut = socket->frameSend->packet;
      packetOut[TCP_FLAGS] = TCP_FLAGS_ACK;
      packetOut[TCP_FLAGS] = TCP_FLAGS_ACK | TCP_FLAGS_PSH;
      TCPSendPacket(socket, socket->frameSend, TCP_DATA + socket->sendOffset);
      TCPSendPacket(socket, socket->frameSend, TCP_DATA + socket->sendOffset);
      socket->seq += socket->sendOffset;
      socket->seq += socket->sendOffset;
      socket->frameSend = NULL;
      socket->frameSend = NULL;
      socket->sendOffset = 0;
      socket->sendOffset = 0;
   }
   }
Line 1524... Line 1544...
            }
            }
            break;
            break;
         }
         }
      }
      }
   }
   }
   if(FrameSendFunc)
 
      IPClose(socket);
      IPClose(socket);
}
}
 
 
 
 
uint32 IPResolve(char *name, IPFuncPtr resolvedFunc, void *arg)
void IPResolve(char *name, IPFuncPtr resolvedFunc, void *arg)
{
{
   uint8 buf[200], *ptr;
   uint8 buf[200], *ptr;
   int length, i;
   int length, i;
   IPSocket *socket;
   IPSocket *socket;
   uint32 ipAddress=0;
 
 
 
   socket = IPOpen(IP_MODE_UDP, ipAddressDns, DNS_PORT, DnsCallback);
   socket = IPOpen(IP_MODE_UDP, ipAddressDns, DNS_PORT, DnsCallback);
   memset(buf, 0, sizeof(buf));
   memset(buf, 0, sizeof(buf));
   buf[DNS_ID+1] = 1;
   buf[DNS_ID+1] = 1;
   buf[DNS_FLAGS] = 1;
   buf[DNS_FLAGS] = 1;
Line 1569... Line 1587...
 
 
   socket->userFunc = (IPFuncPtr)resolvedFunc;
   socket->userFunc = (IPFuncPtr)resolvedFunc;
   socket->userPtr = arg;
   socket->userPtr = arg;
   socket->userData = 0;
   socket->userData = 0;
   IPWrite(socket, buf, length);
   IPWrite(socket, buf, length);
 
 
   if(FrameSendFunc == NULL)
 
   {
 
      for(i = 0; i < 1000 && socket->userData == 0; ++i)
 
         OS_ThreadSleep(1);
 
      ipAddress = socket->userData;
 
      IPClose(socket);
 
   }
 
   return ipAddress;
 
}
}
 
 
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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