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)
|
{
|
{
|