Kernel - Slight reworks to timer code
[tpg/acess2.git] / Modules / IPStack / tcp.h
index 93e5c1e..6aa404f 100644 (file)
@@ -6,6 +6,7 @@
 #define _TCP_H_
 
 #include "ipstack.h"
+#include <adt.h>       // tRingBuffer
 
 typedef struct sTCPHeader      tTCPHeader;
 typedef struct sTCPListener    tTCPListener;
@@ -19,7 +20,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));
@@ -67,9 +68,10 @@ 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
@@ -80,37 +82,58 @@ struct sTCPStoredPacket
        Uint8   Data[];
 };
 
+enum eTCPConnectionState
+{
+       TCP_ST_CLOSED,          // 0 - Connection invalid
+       
+       TCP_ST_SYN_SENT,        // 1 - SYN sent by local, waiting for SYN-ACK
+       TCP_ST_SYN_RCVD,        // 2 - SYN recieved, SYN-ACK sent
+       
+       TCP_ST_OPEN,            // 3 - Connection open
+       
+       // Local Close
+       TCP_ST_FIN_WAIT1,       // 4 - FIN sent, waiting for reply (ACK or FIN)
+       TCP_ST_FIN_WAIT2,       // 5 - sent FIN acked, waiting for FIN from peer
+       TCP_ST_CLOSING,         // 6 - Waiting for ACK of FIN (FIN sent and recieved)
+       TCP_ST_TIME_WAIT,       // 7 - Waiting for timeout after local close
+       // Remote close
+       TCP_ST_CLOSE_WAIT,      // 8 - FIN recieved, waiting for user to close (error set, wait for node close)
+       TCP_ST_LAST_ACK,        // 9 - FIN sent and recieved, waiting for ACK
+       TCP_ST_FINISHED         // 10 - Essentially closed, all packets are invalid
+};
+
 struct sTCPConnection
 {
        struct sTCPConnection   *Next;
-        int    State;  //!< Connection state (see ::eTCPConnectionState)
+       enum eTCPConnectionState        State;  //!< Connection state (see ::eTCPConnectionState)
        Uint16  LocalPort;      //!< Local port
        Uint16  RemotePort;     //!< Remote port
        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
        
+       #if 0
        /**
         * \brief Non-ACKed packets
-        * \note FIFO list
+        * \note Ring buffer
         * \{
         */
-       tSpinlock       lQueuedPackets;
-       tTCPStoredPacket        *QueuedPackets; //!< Non-ACKed packets
+       tMutex  lNonACKedPackets;
+       tTCPStoredPacket        *SentPackets;   //!< Non-acknowleged packets
        /**
         * \}
         */
+       #endif
        
        /**
         * \brief Unread Packets
-        * \note Double ended list (fifo)
+        * \note Ring buffer
         * \{
         */
-       tSpinlock       lRecievedPackets;
-       tTCPStoredPacket        *RecievedPackets;       //!< Unread Packets
-       tTCPStoredPacket        *RecievedPacketsTail;   //!< Unread Packets (End of list)
+       tMutex  lRecievedPackets;
+       tRingBuffer     *RecievedBuffer;
        /**
         * \}
         */
@@ -118,10 +141,17 @@ struct sTCPConnection
        /**
         * \brief Out of sequence packets
         * \note Sorted list to improve times
+        * \todo Convert this to a ring buffer and a bitmap of valid bytes
         * \{
         */
-       tSpinlock       lFuturePackets; //!< Future packets spinlock
+       #if CACHE_FUTURE_PACKETS_OR_BYTES == bytes
+       Uint32  HighestSequenceRcvd;    //!< Highest sequence number (within window) recieved
+       Uint8   *FuturePacketData;      //!< Future packet data (indexed by sequence number)
+       Uint8   *FuturePacketValidBytes;        //!< Valid byte bitmap (WINDOW_SIZE/8 bytes)
+       #else
+       tShortSpinlock  lFuturePackets; //!< Future packets spinlock
        tTCPStoredPacket        *FuturePackets; //!< Out of sequence packets
+       #endif
        /**
         * \}
         */
@@ -133,11 +163,4 @@ struct sTCPConnection
        // Type is determined by LocalInterface->Type
 };
 
-enum eTCPConnectionState
-{
-       TCP_ST_CLOSED,
-       TCP_ST_HALFOPEN,
-       TCP_ST_OPEN
-};
-
 #endif

UCC git Repository :: git.ucc.asn.au