- Timestamp:
- 06/17/10 10:26:53 (20 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
Whitix/branches/netchannel/user/sdk/network/tcp/tcp_input.c
r2102 r2103 5 5 #include "../checksum.h" 6 6 #include "tcp.h" 7 #include "../seq.h" 7 8 #include "tcp_buffer.h" 8 9 #include "../ipv4.h" … … 77 78 int ret = 0; 78 79 struct TcpSocket* tcpSock = (struct TcpSocket*)(socket->priv); 80 struct TcpHeader* tcpHeader; 79 81 ChanRecvBuffer* chanBuff, *next; 80 82 char* write = (char*)buffer; … … 102 104 while (ret < length) 103 105 { 106 ulong seq, endSeq; 107 char* data; 108 int offset, size; 109 104 110 chanBuff = tcpSock->data; 105 111 … … 107 113 break; 108 114 109 /* TODO: Verify sequence numbers. Don't allow read unless sequential */ 115 data = ChanRecvBufferData(socket->channel, chanBuff); 116 tcpHeader = (struct TcpHeader*)(data + sizeof(struct IpHeader)); 110 117 111 int offset = TcpBufferGetRead(socket->channel, chanBuff); 112 int bytesRead = MIN(TcpBufferLen(socket->channel, chanBuff) - offset, length - 113 ret); 118 seq = NetToHostLong(tcpHeader->seqNum); 119 endSeq = seq + TcpBufferLen(socket->channel, chanBuff); 114 120 115 TCP_DEBUG(("memcpy(%#X, %#X, %d) (%d, %d)\n", write + ret, TcpBufferData(socket->channel, chanBuff)+offset, bytesRead, length, ret)); 121 if (SeqBefore(tcpSock->seqRead, seq)) 122 break; 123 124 offset = tcpSock->seqRead - seq; 125 size = MIN(length - ret, TcpBufferLen(socket->channel, chanBuff) - offset); 116 126 117 127 memcpy(write + ret, TcpBufferData(socket->channel, chanBuff) + 118 offset, bytesRead); 119 ret += bytesRead; 128 offset, size); 129 ret += size; 130 tcpSock->seqRead += size; 120 131 121 132 pthread_mutex_lock(&tcpSock->dataLock); 122 133 123 next = ChanRecvBuffGetPriv(chanBuff); 124 125 TcpBufferAddRead(socket->channel, chanBuff, bytesRead); 126 127 if (bytesRead + offset >= TcpBufferLen(socket->channel, chanBuff)) 134 if (SeqAfterEq(tcpSock->seqRead, endSeq)) 128 135 { 136 next = ChanRecvBuffGetPriv(chanBuff); 129 137 ChanRecvBuffFree(socket->channel, chanBuff); 130 138
