X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Ftcp.h;h=ab910fb9446dc89bb371673df8b5cbf6b45e8685;hb=25f7e9ab0f31ca486c0c981a406d381e160637a4;hp=fd04f7b7840d2671fd55db2f0749f4e6bcc4ef1d;hpb=b3fa9a08edcbc459bd8e9df73186e292470ebfc3;p=tpg%2Facess2.git diff --git a/Modules/IPStack/tcp.h b/Modules/IPStack/tcp.h index fd04f7b7..ab910fb9 100644 --- a/Modules/IPStack/tcp.h +++ b/Modules/IPStack/tcp.h @@ -9,6 +9,7 @@ typedef struct sTCPHeader tTCPHeader; typedef struct sTCPListener tTCPListener; +typedef struct sTCPStoredPacket tTCPStoredPacket; typedef struct sTCPConnection tTCPConnection; struct sTCPHeader @@ -18,7 +19,7 @@ struct sTCPHeader Uint32 SequenceNumber; Uint32 AcknowlegementNumber; #if 0 - struct { + struct { // Lowest to highest unsigned Reserved: 4; unsigned DataOffset: 4; // Size of the header in 32-bit words } __attribute__ ((packed)); @@ -66,9 +67,18 @@ struct sTCPListener tInterface *Interface; //!< Listening Interface tVFS_Node Node; //!< Server Directory node int NextID; //!< Name of the next connection - tSpinlock lConnections; //!< Spinlock for connections + tShortSpinlock lConnections; //!< Spinlock for connections tTCPConnection *Connections; //!< Connections (linked list) - tTCPConnection *volatile NewConnections; + tTCPConnection *volatile NewConnections; + tTCPConnection *ConnectionsTail; +}; + +struct sTCPStoredPacket +{ + struct sTCPStoredPacket *Next; + size_t Length; + Uint32 Sequence; + Uint8 Data[]; }; struct sTCPConnection @@ -80,21 +90,41 @@ struct sTCPConnection tInterface *Interface; //!< Listening Interface tVFS_Node Node; //!< Node - int NextSequenceSend; //!< Next sequence value for outbound packets - int NextSequenceRcv; //!< Next expected sequence value for inbound + Uint32 NextSequenceSend; //!< Next sequence value for outbound packets + Uint32 NextSequenceRcv; //!< Next expected sequence value for inbound - int nQueuedPackets; //!< Number of packets not ACKed - struct { - int Sequence; - void *Data; - } *QueuedPackets; //!< Non-ACKed packets + /** + * \brief Non-ACKed packets + * \note FIFO list + * \{ + */ + tMutex lQueuedPackets; + tTCPStoredPacket *QueuedPackets; //!< Non-ACKed packets + /** + * \} + */ + /** + * \brief Unread Packets + * \note Ring buffer + * \{ + */ + tMutex lRecievedPackets; + tRingBuffer *RecievedBuffer; + /** + * \} + */ - int nFuturePackets; //!< Number of packets recieved that are out of sequence - struct { - int SequenceNum; - void *Data; - } **FuturePackets; //!< Out of sequence packets + /** + * \brief Out of sequence packets + * \note Sorted list to improve times + * \{ + */ + tShortSpinlock lFuturePackets; //!< Future packets spinlock + tTCPStoredPacket *FuturePackets; //!< Out of sequence packets + /** + * \} + */ union { tIPv4 v4; @@ -106,8 +136,11 @@ struct sTCPConnection enum eTCPConnectionState { TCP_ST_CLOSED, + TCP_ST_SYN_SENT, TCP_ST_HALFOPEN, - TCP_ST_OPEN + TCP_ST_OPEN, + TCP_ST_FIN_SENT, + TCP_ST_FINISHED }; #endif