+void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Header, int Length)
+{
+ tTCPStoredPacket *pkt;
+ int dataLen;
+
+ Connection->State = TCP_ST_OPEN;
+ if(Header->Flags & TCP_FLAG_SYN) {
+ Connection->NextSequenceRcv = Header->SequenceNumber + 1;
+ }
+
+ if(Header->Flags & TCP_FLAG_ACK) {
+ // TODO: Process an ACKed Packet
+ Log("[TCP ] Conn %p, Packet 0x%x ACKed", Connection, Header->AcknowlegementNumber);
+ return ;
+ }
+
+ // Allocate and fill cached packet
+ dataLen = Length - (Header->DataOffset&0xF)*4;
+ pkt = malloc( dataLen + sizeof(tTCPStoredPacket) );
+ pkt->Next = NULL;
+ pkt->Sequence = Header->SequenceNumber;
+ memcpy(pkt->Data, (Uint8*)Header + (Header->DataOffset&0xF)*4, dataLen);
+
+ if( Header->SequenceNumber != Connection->NextSequenceRcv )
+ {
+ tTCPStoredPacket *tmp, *prev;
+ for(tmp = Connection->FuturePackets;
+ tmp;
+ prev = tmp, tmp = tmp->Next)
+ {
+ if(tmp->Sequence > pkt->Sequence) break;
+ }
+ if(prev)
+ prev->Next = pkt;
+ else
+ Connection->FuturePackets = pkt;
+ pkt->Next = tmp;
+ }
+ else
+ {
+ LOCK( &Connection->lRecievedPackets );
+ if(Connection->RecievedPackets)
+ {
+ Connection->RecievedPacketsTail->Next = pkt;
+ Connection->RecievedPacketsTail = pkt;
+ }
+ else
+ {
+ Connection->RecievedPackets = pkt;
+ Connection->RecievedPacketsTail = pkt;
+ }
+ RELEASE( &Connection->lRecievedPackets );
+ }