Show
Ignore:
Timestamp:
06/17/10 10:26:53 (20 months ago)
Author:
mwhitworth
Message:

Rewrite SocketRead method.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/netchannel/user/sdk/network/tcp/tcp_input.c

    r2102 r2103  
    55#include "../checksum.h" 
    66#include "tcp.h" 
     7#include "../seq.h" 
    78#include "tcp_buffer.h" 
    89#include "../ipv4.h" 
     
    7778        int ret = 0; 
    7879        struct TcpSocket* tcpSock = (struct TcpSocket*)(socket->priv); 
     80        struct TcpHeader* tcpHeader; 
    7981        ChanRecvBuffer* chanBuff, *next; 
    8082        char* write = (char*)buffer; 
     
    102104        while (ret < length) 
    103105        { 
     106                ulong seq, endSeq; 
     107                char* data; 
     108                int offset, size; 
     109 
    104110                chanBuff = tcpSock->data; 
    105111 
     
    107113                        break; 
    108114 
    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)); 
    110117 
    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); 
    114120 
    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); 
    116126 
    117127                memcpy(write + ret, TcpBufferData(socket->channel, chanBuff) + 
    118                                 offset, bytesRead); 
    119                 ret += bytesRead; 
     128                                offset, size); 
     129                ret += size; 
     130                tcpSock->seqRead += size; 
    120131 
    121132                pthread_mutex_lock(&tcpSock->dataLock); 
    122133 
    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)) 
    128135                { 
     136                        next = ChanRecvBuffGetPriv(chanBuff); 
    129137                        ChanRecvBuffFree(socket->channel, chanBuff); 
    130138