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

Subversion Repositories mlite

[/] [mlite/] [trunk/] [kernel/] [tcpip.c] - Diff between revs 257 and 296

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

Rev 257 Rev 296
Line 184... Line 184...
static uint8 ipAddressPlasma[] =  {0x9d, 0xfe, 0x28, 10};   //changed by DHCP
static uint8 ipAddressPlasma[] =  {0x9d, 0xfe, 0x28, 10};   //changed by DHCP
static uint8 ipAddressGateway[] = {0xff, 0xff, 0xff, 0xff}; //changed by DHCP
static uint8 ipAddressGateway[] = {0xff, 0xff, 0xff, 0xff}; //changed by DHCP
static uint32 ipAddressDns;                                 //changed by DHCP
static uint32 ipAddressDns;                                 //changed by DHCP
 
 
static OS_Mutex_t *IPMutex;
static OS_Mutex_t *IPMutex;
static int FrameFreeCount=FRAME_COUNT;
static int FrameFreeCount;
static IPFrame *FrameFreeHead;
static IPFrame *FrameFreeHead;
static IPFrame *FrameSendHead;
static IPFrame *FrameSendHead;
static IPFrame *FrameSendTail;
static IPFrame *FrameSendTail;
static IPFrame *FrameResendHead;
static IPFrame *FrameResendHead;
static IPFrame *FrameResendTail;
static IPFrame *FrameResendTail;
Line 209... Line 209...
   0xff, 0xff, 0xff, 0xff,
   0xff, 0xff, 0xff, 0xff,
   0x00, 0x44, 0x00, 0x43, 0x01, 0x34, 0x45, 0x66, //udp
   0x00, 0x44, 0x00, 0x43, 0x01, 0x34, 0x45, 0x66, //udp
   0x01, 0x01, 0x06, 0x00, 0x69, 0x26, 0xb5, 0x52  //dhcp
   0x01, 0x01, 0x06, 0x00, 0x69, 0x26, 0xb5, 0x52  //dhcp
};
};
 
 
static const unsigned char dhcpOptions[] = {
static unsigned char dhcpOptions[] = {
   0x63, 0x82, 0x53, 0x63,      //cookie
   0x63, 0x82, 0x53, 0x63,      //cookie
   0x35, 0x01, 0x01,            //DHCP Discover
   0x35, 0x01, 0x01,            //DHCP Discover
   0x3d, 0x07, 0x01, 0x00, 0x10, 0xdd, 0xce, 0x15, 0xd4, //Client identifier
   0x3d, 0x07, 0x01, 0x00, 0x10, 0xdd, 0xce, 0x15, 0xd4, //Client identifier
#ifndef WIN32
#ifndef WIN32
   0x0c, 0x06, 'p', 'l', 'a', 's', 'm', 'a',             //Host name
   0x0c, 0x06, 'p', 'l', 'a', 's', 'm', 'a',             //Host name
Line 232... Line 232...
   uint32 state;
   uint32 state;
 
 
   state = OS_CriticalBegin();
   state = OS_CriticalBegin();
   if(FrameFreeCount > freeCount)
   if(FrameFreeCount > freeCount)
   {
   {
      --FrameFreeCount;
 
      frame = FrameFreeHead;
      frame = FrameFreeHead;
      if(FrameFreeHead)
      if(FrameFreeHead)
 
      {
         FrameFreeHead = FrameFreeHead->next;
         FrameFreeHead = FrameFreeHead->next;
 
         --FrameFreeCount;
 
      }
   }
   }
   OS_CriticalEnd(state);
   OS_CriticalEnd(state);
   if(frame)
   if(frame)
   {
   {
      assert(frame->state == 0);
      assert(frame->state == 0);
Line 373... Line 375...
      FrameFree(frame);     //can't be ACK'ed
      FrameFree(frame);     //can't be ACK'ed
   }
   }
   else
   else
   {
   {
      //Put on resend list until TCP ACK'ed
      //Put on resend list until TCP ACK'ed
      frame->timeout = RETRANSMIT_TIME;
      frame->timeout = RETRANSMIT_TIME * frame->retryCnt;
      FrameInsert(&FrameResendHead, &FrameResendTail, frame);
      FrameInsert(&FrameResendHead, &FrameResendTail, frame);
   }
   }
}
}
 
 
 
 
Line 549... Line 551...
      memcpy(packetOut+DHCP_CLIENT_ETHERNET, ethernetAddressPlasma, 6);
      memcpy(packetOut+DHCP_CLIENT_ETHERNET, ethernetAddressPlasma, 6);
      memcpy(packetOut+DHCP_MAGIC_COOKIE, dhcpOptions, sizeof(dhcpOptions));
      memcpy(packetOut+DHCP_MAGIC_COOKIE, dhcpOptions, sizeof(dhcpOptions));
      memcpy(packetOut+DHCP_MAGIC_COOKIE+10, ethernetAddressPlasma, 6);
      memcpy(packetOut+DHCP_MAGIC_COOKIE+10, ethernetAddressPlasma, 6);
      IPSendPacket(NULL, frame, 400);
      IPSendPacket(NULL, frame, 400);
      request = DHCP_DISCOVER;
      request = DHCP_DISCOVER;
      DhcpRetrySeconds = RETRANSMIT_TIME;
      DhcpRetrySeconds = 2;
   }
   }
   else if(state == 2 && memcmp(packet+DHCP_CLIENT_ETHERNET, ethernetAddressPlasma, 6) == 0)
   else if(state == 2 && memcmp(packet+DHCP_CLIENT_ETHERNET, ethernetAddressPlasma, 6) == 0)
   {
   {
      if(packet[DHCP_MAGIC_COOKIE+6] == DHCP_OFFER && request == DHCP_DISCOVER)
      if(packet[DHCP_MAGIC_COOKIE+6] == DHCP_OFFER && request == DHCP_DISCOVER)
      {
      {
Line 691... Line 693...
            socketNew = (IPSocket*)malloc(sizeof(IPSocket));
            socketNew = (IPSocket*)malloc(sizeof(IPSocket));
            if(socketNew == NULL)
            if(socketNew == NULL)
               return 0;
               return 0;
            memcpy(socketNew, socket, sizeof(IPSocket));
            memcpy(socketNew, socket, sizeof(IPSocket));
            socketNew->state = IP_TCP;
            socketNew->state = IP_TCP;
            socketNew->timeout = RETRANSMIT_TIME * 3;
            socketNew->timeout = SOCKET_TIMEOUT;
            socketNew->ack = seq;
            socketNew->ack = seq;
            socketNew->seq = socketNew->ack + 0x12345678;
            socketNew->seq = socketNew->ack + 0x12345678;
            socketNew->seqReceived = socketNew->seq;
            socketNew->seqReceived = socketNew->seq;
 
 
            //Send ACK
            //Send ACK
Line 1098... Line 1100...
   return (uint8*)IPFrameGet(FRAME_COUNT_RCV);
   return (uint8*)IPFrameGet(FRAME_COUNT_RCV);
}
}
 
 
 
 
//Set FrameSendFunction only if single threaded
//Set FrameSendFunction only if single threaded
void IPInit(IPFuncPtr frameSendFunction)
void IPInit(IPFuncPtr frameSendFunction, uint8 macAddress[6], char name[6])
{
{
   int i;
   int i;
   IPFrame *frame;
   IPFrame *frame;
 
 
 
   if(macAddress)
 
      memcpy(ethernetAddressPlasma, macAddress, 6);
 
   if(name)
 
      memcpy(dhcpOptions+18, name, 6);
   FrameSendFunc = frameSendFunction;
   FrameSendFunc = frameSendFunction;
   IPMutex = OS_MutexCreate("IPSem");
   IPMutex = OS_MutexCreate("IPSem");
   IPMQueue = OS_MQueueCreate("IPMQ", FRAME_COUNT*2, 32);
   IPMQueue = OS_MQueueCreate("IPMQ", FRAME_COUNT*2, 32);
   for(i = 0; i < FRAME_COUNT; ++i)
   for(i = 0; i < FRAME_COUNT; ++i)
   {
   {
Line 1114... Line 1120...
      memset(frame, 0, sizeof(IPFrame));
      memset(frame, 0, sizeof(IPFrame));
      frame->next = FrameFreeHead;
      frame->next = FrameFreeHead;
      frame->prev = NULL;
      frame->prev = NULL;
      FrameFreeHead = frame;
      FrameFreeHead = frame;
   }
   }
 
   FrameFreeCount = FRAME_COUNT;
   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
}
}
Line 1474... Line 1481...
 
 
void IPTick(void)
void IPTick(void)
{
{
   IPFrame *frame, *frame2;
   IPFrame *frame, *frame2;
   IPSocket *socket, *socket2;
   IPSocket *socket, *socket2;
 
   unsigned long ticks;
 
   static unsigned long ticksPrev=0, ticksPrev2=0;
 
 
 
   ticks = OS_ThreadTime();
 
   if(ticks - ticksPrev >= 95)
 
   {
   if(IPVerbose && (Seconds % 60) == 0)
   if(IPVerbose && (Seconds % 60) == 0)
   {
   {
      if(FrameFreeCount == FRAME_COUNT)
         if(FrameFreeCount >= FRAME_COUNT-1)
         printf("T");
         printf("T");
      else
      else
         printf("T(%d)", FrameFreeCount);
         printf("T(%d)", FrameFreeCount);
   }
   }
   ++Seconds;
   ++Seconds;
   if(--DhcpRetrySeconds <= 0)
   if(--DhcpRetrySeconds <= 0)
      IPDhcp(NULL, 400, 1);   //DHCP request
      IPDhcp(NULL, 400, 1);   //DHCP request
   //if(Seconds == 10)
   }
   //   IPResolve("plasmacpu.no-ip.org", ShowIP);
 
 
 
   OS_MutexPend(IPMutex);
   OS_MutexPend(IPMutex);
 
 
   //Retransmit timeout packets
   //Retransmit timeout packets
   for(frame = FrameResendHead; frame; )
   for(frame = FrameResendHead; frame; )
   {
   {
      frame2 = frame;
      frame2 = frame;
      frame = frame->next;
      frame = frame->next;
      if(--frame2->timeout == 0)
      frame2->timeout -= ticks - ticksPrev2;
 
      if(--frame2->timeout <= 0)
      {
      {
         if(IPVerbose)
         if(IPVerbose)
            printf("r");
            printf("r");
         FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
         FrameRemove(&FrameResendHead, &FrameResendTail, frame2);
         IPSendFrame(frame2);
         IPSendFrame(frame2);
      }
      }
   }
   }
 
 
 
   if(ticks - ticksPrev >= 95)
 
   {
   //Close timed out sockets
   //Close timed out sockets
   for(socket = SocketHead; socket; )
   for(socket = SocketHead; socket; )
   {
   {
      socket2 = socket;
      socket2 = socket;
      socket = socket->next;
      socket = socket->next;
Line 1523... Line 1537...
            IPClose(socket2);
            IPClose(socket2);
         else
         else
            IPClose2(socket2);
            IPClose2(socket2);
      }
      }
   }
   }
 
      ticksPrev = ticks;
 
   }
   OS_MutexPost(IPMutex);
   OS_MutexPost(IPMutex);
 
   ticksPrev2 = ticks;
}
}
 
 
 
 
static void DnsCallback(IPSocket *socket)
static void DnsCallback(IPSocket *socket)
{
{

powered by: WebSVN 2.1.0

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