- Timestamp:
- 06/17/10 10:26:53 (3 months ago)
- Location:
- Whitix/branches/netchannel/user/sdk/network/tcp
- Files:
-
- 4 modified
-
tcp.c (modified) (3 diffs)
-
tcp.h (modified) (1 diff)
-
tcp_buffer.h (modified) (2 diffs)
-
tcp_input.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Whitix/branches/netchannel/user/sdk/network/tcp/tcp.c
r2102 r2103 179 179 { 180 180 TcpChangeState(tcpSock, TCP_ESTABLISHED); 181 tcpSock->seqRead = seq + 1; 181 182 TcpSendBit(tcpSock, TCP_FLAG_ACK); 182 183 return 0; … … 293 294 if (dataLen > 0) 294 295 { 295 ChanRecvBuffAddRead(tcpSock->channel, buffer, IpGetHeaderSize(ipHeader) + TcpGetHeaderSize(header));296 297 296 tcpSock->stats.totalBytesRecv += dataLen; 298 297 tcpSock->stats.totalPacketsRecv++; … … 382 381 383 382 if (header->ack) 384 { 385 if (SeqBetween(ack, tcpSock->localUna, tcpSock->localNext)) 386 { 387 TcpChangeState(tcpSock, TCP_ESTABLISHED); 388 return TcpEstablished(tcpSock, header, buffer, length); 389 } 390 } 383 if (SeqBetween(ack, tcpSock->localUna, tcpSock->localNext)) 384 { 385 TcpChangeState(tcpSock, TCP_ESTABLISHED); 386 tcpSock->seqRead = NetToHostLong(header->seqNum); 387 return TcpEstablished(tcpSock, header, buffer, length); 388 } 391 389 392 390 if (header->fin) -
Whitix/branches/netchannel/user/sdk/network/tcp/tcp.h
r2102 r2103 72 72 ulong localUrg, localWl1, localWl2, localSeqInit; 73 73 ulong localCwnd, localCwndBytes, localThresh; 74 ulong seqRead; 74 75 75 76 /* Acknowledgements. */ -
Whitix/branches/netchannel/user/sdk/network/tcp/tcp_buffer.h
r2099 r2103 13 13 } 14 14 15 static inline int TcpBufferGetRead(Channel* channel, ChanRecvBuffer* buffer)16 {17 struct TcpHeader* header = (ChanRecvBufferData(channel, buffer) + sizeof(struct18 IpHeader));19 return ChanRecvBuffGetRead(buffer) - TcpGetHeaderSize(header) -20 sizeof(struct IpHeader);21 }22 23 15 static inline char* TcpBufferData(Channel* channel, ChanRecvBuffer* buffer) 24 16 { … … 28 20 } 29 21 30 static inline void TcpBufferAddRead(Channel* channel, ChanRecvBuffer* buffer, unsigned short add)31 {32 ChanRecvBuffAddRead(channel, buffer, add);33 }34 35 22 #endif -
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
