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)
|
|
#else
|
|
#undef printf
|
|
#define printf UartPrintfPoll
|
|
//#define printf UartPrintfNull
|
#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 487... |
Line 491... |
packet[TCP_ACK+2] = (uint8)(socket->ack >> 8);
|
packet[TCP_ACK+2] = (uint8)(socket->ack >> 8);
|
packet[TCP_ACK+3] = (uint8)socket->ack;
|
packet[TCP_ACK+3] = (uint8)socket->ack;
|
count = FrameFreeCount - FRAME_COUNT_WINDOW;
|
count = FrameFreeCount - FRAME_COUNT_WINDOW;
|
if(count < 1)
|
if(count < 1)
|
count = 1;
|
count = 1;
|
|
if(count > 4)
|
|
count = 4;
|
count *= 512;
|
count *= 512;
|
packet[TCP_WINDOW_SIZE] = (uint8)(count >> 8);
|
packet[TCP_WINDOW_SIZE] = (uint8)(count >> 8);
|
packet[TCP_WINDOW_SIZE+1] = (uint8)count;
|
packet[TCP_WINDOW_SIZE+1] = (uint8)count;
|
packet[TCP_URGENT_POINTER] = 0;
|
packet[TCP_URGENT_POINTER] = 0;
|
packet[TCP_URGENT_POINTER+1] = 0;
|
packet[TCP_URGENT_POINTER+1] = 0;
|
Line 820... |
Line 826... |
{
|
{
|
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
|
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK;
|
TCPSendPacket(socket, frameOut, TCP_DATA);
|
TCPSendPacket(socket, frameOut, TCP_DATA);
|
}
|
}
|
|
|
|
//Determine window
|
|
socket->seqWindow = (packet[TCP_WINDOW_SIZE] << 8) | packet[TCP_WINDOW_SIZE+1];
|
|
if(socket->seqWindow < 8)
|
|
socket->seqWindow = 8;
|
|
|
//Notify application
|
//Notify application
|
if(socket->funcPtr)
|
if(socket->funcPtr)
|
socket->funcPtr(socket);
|
socket->funcPtr(socket);
|
//Using frame
|
//Using frame
|
return 1;
|
return 1;
|
Line 1205... |
Line 1216... |
|
|
uint32 IPWrite(IPSocket *Socket, const uint8 *Buf, uint32 Length)
|
uint32 IPWrite(IPSocket *Socket, const uint8 *Buf, uint32 Length)
|
{
|
{
|
IPFrame *frameOut;
|
IPFrame *frameOut;
|
uint8 *packetOut;
|
uint8 *packetOut;
|
uint32 bytes, count=0;
|
uint32 bytes, count=0, tries;
|
int offset;
|
int offset;
|
|
OS_Thread_t *self;
|
|
|
//printf("IPWrite(0x%x, %d)", Socket, Length);
|
//printf("IPWrite(0x%x, %d)", Socket, Length);
|
|
self = OS_ThreadSelf();
|
while(Length)
|
while(Length)
|
{
|
{
|
if(Socket->frameSend == NULL)
|
tries = 0;
|
|
while(Socket->frameSend == NULL)
|
{
|
{
|
Socket->frameSend = IPFrameGet(FRAME_COUNT_SEND);
|
Socket->frameSend = IPFrameGet(FRAME_COUNT_SEND);
|
Socket->sendOffset = 0;
|
Socket->sendOffset = 0;
|
|
if(Socket->frameSend == NULL)
|
|
{
|
|
if(self == IPThread || ++tries > 200)
|
|
break;
|
|
else
|
|
OS_ThreadSleep(1);
|
|
}
|
}
|
}
|
frameOut = Socket->frameSend;
|
frameOut = Socket->frameSend;
|
offset = Socket->sendOffset;
|
offset = Socket->sendOffset;
|
if(frameOut == NULL)
|
if(frameOut == NULL)
|
break;
|
break;
|
Line 1231... |
Line 1252... |
if(Socket->state != IP_UDP)
|
if(Socket->state != IP_UDP)
|
{
|
{
|
memcpy(packetOut+TCP_DATA+offset, Buf, bytes);
|
memcpy(packetOut+TCP_DATA+offset, Buf, bytes);
|
if(Socket->sendOffset >= 512)
|
if(Socket->sendOffset >= 512)
|
IPWriteFlush(Socket);
|
IPWriteFlush(Socket);
|
|
//if(Socket->seq - Socket->seqReceived > Socket->seqWindow)
|
|
//{
|
|
// printf("W");
|
|
// OS_ThreadSleep(10);
|
|
//}
|
}
|
}
|
else //UDP
|
else //UDP
|
{
|
{
|
memcpy(packetOut+UDP_DATA+offset, Buf, bytes);
|
memcpy(packetOut+UDP_DATA+offset, Buf, bytes);
|
memcpy(packetOut, Socket->headerSend, UDP_LENGTH);
|
memcpy(packetOut, Socket->headerSend, UDP_LENGTH);
|
Line 1247... |
Line 1273... |
}
|
}
|
return count;
|
return count;
|
}
|
}
|
|
|
|
|
void IPWritePend(IPSocket *Socket, uint8 *Buf, uint32 Length)
|
|
{
|
|
int bytes;
|
|
OS_Thread_t *self;
|
|
|
|
self = OS_ThreadSelf();
|
|
assert(self != IPThread);
|
|
while(Length)
|
|
{
|
|
bytes = IPWrite(Socket, Buf, Length);
|
|
Buf += bytes;
|
|
Length -= bytes;
|
|
if(Length)
|
|
OS_ThreadSleep(1);
|
|
}
|
|
}
|
|
|
|
|
|
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;
|
|
|