URL
https://opencores.org/ocsvn/mlite/mlite/trunk
Subversion Repositories mlite
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 159 to Rev 160
- ↔ Reverse comparison
Rev 159 → Rev 160
/trunk/kernel/tcpip.c
357,7 → 357,7
{ |
int length; |
length = frame->length - TCP_DATA; |
if(frame->packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_ACK)) |
if(frame->packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_SYN)) |
++length; |
if(frame->socket == NULL || frame->socket->state == IP_UDP || length == 0 || |
++frame->retryCnt > 4) |
454,7 → 454,8
} |
} |
|
if(socket && (packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_ACK))) |
length2 = length - TCP_DATA; |
if(socket && (packet[TCP_FLAGS] & (TCP_FLAGS_FIN | TCP_FLAGS_SYN))) |
length2 = 1; |
frame->socket = socket; |
frame->timeout = 0; |
468,7 → 469,7
static void TCPSendPacket(IPSocket *socket, IPFrame *frame, int length) |
{ |
uint8 *packet = frame->packet; |
int flags; |
int flags, count; |
|
flags = packet[TCP_FLAGS]; |
memcpy(packet, socket->headerSend, TCP_SEQ); |
485,8 → 486,12
packet[TCP_ACK+1] = (uint8)(socket->ack >> 16); |
packet[TCP_ACK+2] = (uint8)(socket->ack >> 8); |
packet[TCP_ACK+3] = (uint8)socket->ack; |
packet[TCP_WINDOW_SIZE] = 128; |
packet[TCP_WINDOW_SIZE+1] = 0; |
count = FrameFreeCount - FRAME_COUNT_WINDOW; |
if(count < 1) |
count = 1; |
count *= 512; |
packet[TCP_WINDOW_SIZE] = (uint8)(count >> 8); |
packet[TCP_WINDOW_SIZE+1] = (uint8)count; |
packet[TCP_URGENT_POINTER] = 0; |
packet[TCP_URGENT_POINTER+1] = 0; |
IPSendPacket(socket, frame, length); |
637,7 → 642,7
(packet[TCP_ACK+2] << 8) | packet[TCP_ACK+3]; |
|
//Check if start of connection |
if(packet[TCP_FLAGS] & TCP_FLAGS_SYN) |
if((packet[TCP_FLAGS] & (TCP_FLAGS_SYN | TCP_FLAGS_ACK)) == TCP_FLAGS_SYN) |
{ |
if(IPVerbose) |
printf("S"); |
663,7 → 668,7
memcmp(packet+TCP_DEST_PORT, socket->headerRcv+TCP_DEST_PORT, 2) == 0) |
{ |
//Create a new socket |
frameOut = IPFrameGet(0); |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut == NULL) |
return 0; |
socketNew = (IPSocket*)malloc(sizeof(IPSocket)); |
733,7 → 738,11
if(socket->state == IP_FIN_SERVER) |
IPClose2(socket); |
else |
{ |
socket->state = IP_FIN_CLIENT; |
if(socket->funcPtr) |
socket->funcPtr(socket); |
} |
} |
else if(packet[TCP_FLAGS] & TCP_FLAGS_RST) |
{ |
740,18 → 749,14
if(socket->state == IP_FIN_SERVER) |
IPClose2(socket); |
else |
{ |
socket->state = IP_FIN_CLIENT; |
if(socket->funcPtr) |
socket->funcPtr(socket); |
} |
} |
else |
{ |
//TCP payload |
if(packet[TCP_HEADER_LENGTH] != 0x50) |
{ |
if(IPVerbose) |
printf("length error\n"); |
return 0; |
} |
|
//Check if packets can be removed from retransmition list |
if(ack != socket->seqReceived) |
{ |
763,7 → 768,8
if(framePrev->socket == socket && (int)(ack - framePrev->seqEnd) >= 0) |
{ |
//Remove packet from retransmition queue |
socket->timeout = SOCKET_TIMEOUT; |
if(socket->timeout) |
socket->timeout = SOCKET_TIMEOUT; |
FrameRemove(&FrameResendHead, &FrameResendTail, framePrev); |
FrameFree(framePrev); |
} |
774,11 → 780,35
|
bytes = ip_length - (TCP_DATA - IP_VERSION_LENGTH); |
|
//Check if SYN/ACK |
if((packet[TCP_FLAGS] & (TCP_FLAGS_SYN | TCP_FLAGS_ACK)) == |
(TCP_FLAGS_SYN | TCP_FLAGS_ACK)) |
{ |
//Ack SYN/ACK |
socket->ack = seq + 1; |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut) |
{ |
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK; |
TCPSendPacket(socket, frameOut, TCP_DATA); |
} |
if(socket->funcPtr) |
socket->funcPtr(socket); |
return 0; |
} |
else if(packet[TCP_HEADER_LENGTH] != 0x50) |
{ |
if(IPVerbose) |
printf("length error\n"); |
return 0; |
} |
|
//Copy packet into socket |
if(socket->ack == seq && bytes > 0) |
{ |
//Insert packet into socket linked list |
socket->timeout = SOCKET_TIMEOUT; |
if(socket->timeout) |
socket->timeout = SOCKET_TIMEOUT; |
if(IPVerbose) |
printf("D"); |
FrameInsert(&socket->frameReadHead, &socket->frameReadTail, frameIn); |
785,7 → 815,7
socket->ack += bytes; |
|
//Ack data |
frameOut = IPFrameGet(FRAME_MIN_COUNT); |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut) |
{ |
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK; |
799,10 → 829,10
return 1; |
} |
|
if(bytes > 0) |
if(bytes) |
{ |
//Ack with current offset since data missing |
frameOut = IPFrameGet(FRAME_MIN_COUNT); |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut) |
{ |
frameOut->packet[TCP_FLAGS] = TCP_FLAGS_ACK; |
893,7 → 923,7
{ |
if(packet[PING_TYPE] != 8) |
return 0; |
frameOut = IPFrameGet(0); |
frameOut = IPFrameGet(FRAME_COUNT_SEND); |
if(frameOut == NULL) |
return 0; |
packetOut = frameOut->packet; |
1013,7 → 1043,7
|
uint8 *MyPacketGet(void) |
{ |
return (uint8*)IPFrameGet(0); |
return (uint8*)IPFrameGet(FRAME_COUNT_RCV); |
} |
|
|
1046,8 → 1076,9
IPSocket *IPOpen(IPMode_e Mode, uint32 IPAddress, uint32 Port, IPFuncPtr funcPtr) |
{ |
IPSocket *socket; |
uint8 *ptr; |
static int portSource=0x1000; |
uint8 *ptrSend, *ptrRcv; |
IPFrame *frame; |
static int portSource=0x1007; |
(void)Mode; |
(void)IPAddress; |
|
1065,7 → 1096,8
socket->userData = 0; |
socket->userFunc = NULL; |
socket->userPtr = NULL; |
ptr = socket->headerSend; |
ptrSend = socket->headerSend; |
ptrRcv = socket->headerRcv; |
|
if(IPAddress == 0) |
{ |
1075,46 → 1107,83
} |
else |
{ |
//Setup receive port |
socket->headerRcv[TCP_DEST_PORT] = (uint8)(portSource >> 8); |
socket->headerRcv[TCP_DEST_PORT+1] = (uint8)portSource; |
//Setup sending packet |
memset(ptrSend, 0, UDP_LENGTH); |
memset(ptrRcv, 0, UDP_LENGTH); |
|
//Setup sending packet |
memset(ptr, 0, UDP_LENGTH); |
memcpy(ptr+ETHERNET_DEST, ethernetAddressGateway, 6); |
memcpy(ptr+ETHERNET_SOURCE, ethernetAddressPlasma, 6); |
ptr[ETHERNET_FRAME_TYPE] = 0x08; |
ptr[IP_VERSION_LENGTH] = 0x45; |
ptr[IP_TIME_TO_LIVE] = 0x80; |
ptr[IP_PROTOCOL] = 0x11; //UDP |
memcpy(ptr+IP_SOURCE, ipAddressPlasma, 4); |
ptr[IP_DEST] = (uint8)(IPAddress >> 24); |
ptr[IP_DEST+1] = (uint8)(IPAddress >> 16); |
ptr[IP_DEST+2] = (uint8)(IPAddress >> 8); |
ptr[IP_DEST+3] = (uint8)IPAddress; |
ptr[TCP_SOURCE_PORT] = (uint8)(portSource >> 8); |
ptr[TCP_SOURCE_PORT+1] = (uint8)portSource; |
//Setup Ethernet |
memcpy(ptrSend+ETHERNET_DEST, ethernetAddressGateway, 6); |
memcpy(ptrSend+ETHERNET_SOURCE, ethernetAddressPlasma, 6); |
ptrSend[ETHERNET_FRAME_TYPE] = 0x08; |
|
//Setup IP |
ptrSend[IP_VERSION_LENGTH] = 0x45; |
ptrSend[IP_TIME_TO_LIVE] = 0x80; |
|
//Setup IP addresses |
memcpy(ptrSend+IP_SOURCE, ipAddressPlasma, 4); |
ptrSend[IP_DEST] = (uint8)(IPAddress >> 24); |
ptrSend[IP_DEST+1] = (uint8)(IPAddress >> 16); |
ptrSend[IP_DEST+2] = (uint8)(IPAddress >> 8); |
ptrSend[IP_DEST+3] = (uint8)IPAddress; |
ptrRcv[IP_SOURCE] = (uint8)(IPAddress >> 24); |
ptrRcv[IP_SOURCE+1] = (uint8)(IPAddress >> 16); |
ptrRcv[IP_SOURCE+2] = (uint8)(IPAddress >> 8); |
ptrRcv[IP_SOURCE+3] = (uint8)IPAddress; |
memcpy(ptrRcv+IP_DEST, ipAddressPlasma, 4); |
|
//Setup ports |
ptrSend[TCP_SOURCE_PORT] = (uint8)(portSource >> 8); |
ptrSend[TCP_SOURCE_PORT+1] = (uint8)portSource; |
ptrSend[TCP_DEST_PORT] = (uint8)(Port >> 8); |
ptrSend[TCP_DEST_PORT+1] = (uint8)Port; |
ptrRcv[TCP_SOURCE_PORT] = (uint8)(Port >> 8); |
ptrRcv[TCP_SOURCE_PORT+1] = (uint8)Port; |
ptrRcv[TCP_DEST_PORT] = (uint8)(portSource >> 8); |
ptrRcv[TCP_DEST_PORT+1] = (uint8)portSource; |
++portSource; |
ptr[TCP_DEST_PORT] = (uint8)(Port >> 8); |
ptr[TCP_DEST_PORT+1] = (uint8)Port; |
} |
|
if(Mode == IP_MODE_TCP) |
{ |
socket->headerRcv[IP_PROTOCOL] = 0x06; //TCP |
ptr[IP_PROTOCOL] = 0x06; |
if(IPAddress) |
socket->state = IP_TCP; |
else |
socket->state = IP_LISTEN; |
ptrSend[IP_PROTOCOL] = 0x06; //TCP |
ptrRcv[IP_PROTOCOL] = 0x06; |
} |
else if(Mode == IP_MODE_UDP) |
{ |
socket->state = IP_UDP; |
socket->headerRcv[IP_PROTOCOL] = 0x11; //UDP |
ptr[IP_PROTOCOL] = 0x11; |
ptrSend[IP_PROTOCOL] = 0x11; //UDP |
ptrRcv[IP_PROTOCOL] = 0x11; |
} |
|
//Add socket to linked list |
OS_MutexPend(IPMutex); |
socket->next = SocketHead; |
socket->prev = NULL; |
if(SocketHead) |
SocketHead->prev = socket; |
SocketHead = socket; |
OS_MutexPost(IPMutex); |
|
if(Mode == IP_MODE_TCP && IPAddress) |
{ |
//Send TCP SYN |
frame = IPFrameGet(0); |
if(frame) |
{ |
frame->packet[TCP_FLAGS] = TCP_FLAGS_SYN; |
frame->packet[TCP_DATA] = 2; //maximum segment size = 536 |
frame->packet[TCP_DATA+1] = 4; |
frame->packet[TCP_DATA+2] = 2; |
frame->packet[TCP_DATA+3] = 24; |
TCPSendPacket(socket, frame, TCP_DATA+4); |
++socket->seq; |
} |
} |
return socket; |
} |
|
1146,7 → 1215,7
{ |
if(Socket->frameSend == NULL) |
{ |
Socket->frameSend = IPFrameGet(FRAME_MIN_COUNT); |
Socket->frameSend = IPFrameGet(FRAME_COUNT_SEND); |
Socket->sendOffset = 0; |
} |
frameOut = Socket->frameSend; |