Changeset 2103 for Whitix

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

Rewrite SocketRead method.

Location:
Whitix/branches/netchannel/user/sdk/network/tcp
Files:
4 modified

Legend:

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

    r2102 r2103  
    179179                { 
    180180                        TcpChangeState(tcpSock, TCP_ESTABLISHED); 
     181            tcpSock->seqRead = seq + 1; 
    181182                        TcpSendBit(tcpSock, TCP_FLAG_ACK); 
    182183                        return 0; 
     
    293294        if (dataLen > 0) 
    294295        { 
    295                 ChanRecvBuffAddRead(tcpSock->channel, buffer, IpGetHeaderSize(ipHeader) + TcpGetHeaderSize(header)); 
    296  
    297296                tcpSock->stats.totalBytesRecv += dataLen; 
    298297                tcpSock->stats.totalPacketsRecv++; 
     
    382381 
    383382        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        } 
    391389 
    392390        if (header->fin) 
  • Whitix/branches/netchannel/user/sdk/network/tcp/tcp.h

    r2102 r2103  
    7272        ulong localUrg, localWl1, localWl2, localSeqInit; 
    7373        ulong localCwnd, localCwndBytes, localThresh; 
     74    ulong seqRead; 
    7475 
    7576        /* Acknowledgements. */ 
  • Whitix/branches/netchannel/user/sdk/network/tcp/tcp_buffer.h

    r2099 r2103  
    1313} 
    1414 
    15 static inline int TcpBufferGetRead(Channel* channel, ChanRecvBuffer* buffer) 
    16 { 
    17         struct TcpHeader* header = (ChanRecvBufferData(channel, buffer) + sizeof(struct 
    18                                 IpHeader)); 
    19         return ChanRecvBuffGetRead(buffer) - TcpGetHeaderSize(header) - 
    20                 sizeof(struct IpHeader); 
    21 } 
    22  
    2315static inline char* TcpBufferData(Channel* channel, ChanRecvBuffer* buffer) 
    2416{ 
     
    2820} 
    2921 
    30 static inline void TcpBufferAddRead(Channel* channel, ChanRecvBuffer* buffer, unsigned short add) 
    31 { 
    32         ChanRecvBuffAddRead(channel, buffer, add); 
    33 } 
    34  
    3522#endif 
  • 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