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

Subversion Repositories plasma

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

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

Rev 423 Rev 425
Line 140... Line 140...
#define PING_CHECKSUM         36       //2
#define PING_CHECKSUM         36       //2
#define PING_ID               38       //2
#define PING_ID               38       //2
#define PING_SEQUENCE         40       //2
#define PING_SEQUENCE         40       //2
#define PING_DATA             44
#define PING_DATA             44
 
 
 
enum {FRAME_FREE=0, FRAME_ACQUIRED=1, FRAME_IN_LIST};
 
 
static void IPClose2(IPSocket *Socket);
static void IPClose2(IPSocket *Socket);
static void IPArp(unsigned char ipAddress[4]);
static void IPArp(unsigned char ipAddress[4]);
 
 
typedef struct ArpCache_s {
typedef struct ArpCache_s {
   unsigned char ip[4];
   unsigned char ip[4];
Line 220... Line 222...
      }
      }
   }
   }
   OS_CriticalEnd(state);
   OS_CriticalEnd(state);
   if(frame)
   if(frame)
   {
   {
      assert(frame->state == 0);
      assert(frame->state == FRAME_FREE);
      frame->state = 1;
      frame->state = FRAME_ACQUIRED;
   }
   }
   return frame;
   return frame;
}
}
 
 
 
 
static void FrameFree(IPFrame *frame)
static void FrameFree(IPFrame *frame)
{
{
   uint32 state;
   uint32 state;
 
 
   assert(frame->state == 1);
   assert(frame->state == FRAME_ACQUIRED);
   frame->state = 0;
   frame->state = FRAME_FREE;
   state = OS_CriticalBegin();
   state = OS_CriticalBegin();
   frame->next = FrameFreeHead;
   frame->next = FrameFreeHead;
   FrameFreeHead = frame;
   FrameFreeHead = frame;
   ++FrameFreeCount;
   ++FrameFreeCount;
   OS_CriticalEnd(state);
   OS_CriticalEnd(state);
}
}
 
 
 
 
static void FrameInsert(IPFrame **head, IPFrame **tail, IPFrame *frame)
static void FrameInsert(IPFrame **head, IPFrame **tail, IPFrame *frame)
{
{
   assert(frame->state == 1);
   assert(frame->state == FRAME_ACQUIRED);
   frame->state = 2;
   frame->state = FRAME_IN_LIST;
   OS_MutexPend(IPMutex);
   OS_MutexPend(IPMutex);
   frame->prev = NULL;
   frame->prev = NULL;
   frame->next = *head;
   frame->next = *head;
   if(*head)
   if(*head)
      (*head)->prev = frame;
      (*head)->prev = frame;
Line 259... Line 261...
}
}
 
 
 
 
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 == FRAME_IN_LIST);
   if(frame->state != 2)
   if(frame->state != FRAME_IN_LIST)
   {
   {
      printf("frame->state=%d\n", frame->state);
      printf("frame->state=%d\n", frame->state);
      return;
      return;
   }
   }
   frame->state = 1;
   frame->state = FRAME_ACQUIRED;
   if(frame->prev)
   if(frame->prev)
      frame->prev->next = frame->next;
      frame->prev->next = frame->next;
   else
   else
      *head = frame->next;
      *head = frame->next;
   if(frame->next)
   if(frame->next)
Line 717... Line 719...
            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 = SOCKET_TIMEOUT;
            socketNew->timeout = SOCKET_TIMEOUT;
 
            socketNew->timeoutReset = SOCKET_TIMEOUT * 6;
            socketNew->ack = seq;
            socketNew->ack = seq;
            socketNew->ackProcessed = seq + 1;
            socketNew->ackProcessed = seq + 1;
            socketNew->seq = socketNew->ack + 0x12345678;
            socketNew->seq = socketNew->ack + 0x12345678;
            socketNew->seqReceived = socketNew->seq;
            socketNew->seqReceived = socketNew->seq;
            socketNew->seqWindow = (packet[TCP_WINDOW_SIZE] << 8) | packet[TCP_WINDOW_SIZE+1];
            socketNew->seqWindow = (packet[TCP_WINDOW_SIZE] << 8) | packet[TCP_WINDOW_SIZE+1];
Line 1216... Line 1219...
   if(name)
   if(name)
      memcpy(dhcpOptions+18, name, 6);
      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);
 
   frame = (IPFrame*)malloc(sizeof(IPFrame) * FRAME_COUNT);
 
   if(frame == NULL)
 
      return;
 
   memset(frame, 0, sizeof(IPFrame) * FRAME_COUNT);
   for(i = 0; i < FRAME_COUNT; ++i)
   for(i = 0; i < FRAME_COUNT; ++i)
   {
   {
      frame = (IPFrame*)malloc(sizeof(IPFrame));
 
      memset(frame, 0, sizeof(IPFrame));
 
      frame->next = FrameFreeHead;
      frame->next = FrameFreeHead;
      frame->prev = NULL;
      frame->prev = NULL;
      FrameFreeHead = frame;
      FrameFreeHead = frame;
 
      ++frame;
   }
   }
   FrameFreeCount = FRAME_COUNT;
   FrameFreeCount = FRAME_COUNT;
#ifndef WIN32
#ifndef WIN32
   UartPacketConfig(MyPacketGet, PACKET_SIZE, IPMQueue);
   UartPacketConfig(MyPacketGet, PACKET_SIZE, IPMQueue);
   if(frameSendFunction == NULL)
   if(frameSendFunction == NULL)
Line 1412... Line 1418...
   {
   {
      //Rate limit output
      //Rate limit output
      if(socket->seq - socket->seqReceived >= SEND_WINDOW)
      if(socket->seq - socket->seqReceived >= SEND_WINDOW)
      {
      {
         //printf("l(%d,%d,%d) ", socket->seq - socket->seqReceived, socket->seq, socket->seqReceived);
         //printf("l(%d,%d,%d) ", socket->seq - socket->seqReceived, socket->seq, socket->seqReceived);
         if(self != IPThread && ++tries < 200)
         if(self != IPThread && ++tries < 20)
         {
         {
            OS_ThreadSleep(1);
            OS_ThreadSleep(10);
            continue;
            continue;
         }
         }
      }
      }
      tries = 0;
      tries = 0;
      while(socket->frameSend == NULL)
      while(socket->frameSend == NULL)
Line 1426... Line 1432...
         socket->frameSend = IPFrameGet(FRAME_COUNT_SEND);
         socket->frameSend = IPFrameGet(FRAME_COUNT_SEND);
         socket->sendOffset = 0;
         socket->sendOffset = 0;
         if(socket->frameSend == NULL)
         if(socket->frameSend == NULL)
         {
         {
            //printf("L");
            //printf("L");
            if(self == IPThread || ++tries > 200)
            if(self == IPThread || ++tries > 40)
               break;
               break;
            else
            else
               OS_ThreadSleep(1);
               OS_ThreadSleep(10);
         }
         }
      }
      }
      frameOut = socket->frameSend;
      frameOut = socket->frameSend;
      offset = socket->sendOffset;
      offset = socket->sendOffset;
      if(frameOut == NULL)
      if(frameOut == NULL)
 
      {
 
         printf("X");
         break;
         break;
 
      }
      packetOut = frameOut->packet;
      packetOut = frameOut->packet;
 
 
      if(socket->state == IP_PING)
      if(socket->state == IP_PING)
      {
      {
         bytes = length;
         bytes = length;
Line 1769... Line 1778...
   uint8 buf[200], *ptr;
   uint8 buf[200], *ptr;
   int length, i;
   int length, i;
   IPSocket *socket;
   IPSocket *socket;
 
 
   socket = IPOpen(IP_MODE_UDP, ipAddressDns, DNS_PORT, DnsCallback);
   socket = IPOpen(IP_MODE_UDP, ipAddressDns, DNS_PORT, DnsCallback);
 
   if(socket == NULL)
 
      return;
   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;
   buf[DNS_NUM_QUESTIONS+1] = 1;
   buf[DNS_NUM_QUESTIONS+1] = 1;
 
 

powered by: WebSVN 2.1.0

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