]> git.meshlink.io Git - utcp/blobdiff - utcp_priv.h
Call the poll callback with 0 whenever a connection is closed.
[utcp] / utcp_priv.h
index 24ae4cc4655a0b3d440369f042dc4eb6d705d843..6c5c1f85f052016999b800534e398a21884eec17 100644 (file)
 #define FIN 4
 #define RST 8
 
+#define AUX_INIT 1
+#define AUX_FRAME 2
+#define AUX_SAK 3
+#define AUX_TIMESTAMP 4
+
+#define NSACKS 4
 #define DEFAULT_SNDBUFSIZE 4096
 #define DEFAULT_MAXSNDBUFSIZE 131072
+#define DEFAULT_RCVBUFSIZE 0
+#define DEFAULT_MAXRCVBUFSIZE 131072
+
+#define DEFAULT_MTU 1000
+
+#define USEC_PER_SEC 1000000
+#define DEFAULT_USER_TIMEOUT 60 // sec
+#define CLOCK_GRANULARITY 1000 // usec
+#define START_RTO 1000000 // usec
+#define MAX_RTO 3000000 // usec
 
 struct hdr {
        uint16_t src; // Source port
@@ -71,25 +87,44 @@ static const char *strstate[] __attribute__((unused)) = {
        [TIME_WAIT] = "TIME_WAIT"
 };
 
+struct buffer {
+       char *data;
+       uint32_t used;
+       uint32_t size;
+       uint32_t maxsize;
+};
+
+struct sack {
+       uint32_t offset;
+       uint32_t len;
+};
+
 struct utcp_connection {
        void *priv;
        struct utcp *utcp;
+       uint32_t flags;
+
        bool reapable;
 
-       bool nodelay;
-       bool keepalive;
+       // Callbacks
+
+       utcp_recv_t recv;
+       utcp_poll_t poll;
+
+       // TCP State
 
        uint16_t src;
        uint16_t dst;
        enum state state;
 
-       // The following two structures form the TCB
-
        struct {
                uint32_t una;
                uint32_t nxt;
                uint32_t wnd;
                uint32_t iss;
+
+               uint32_t last;
+               uint32_t cwnd;
        } snd;
 
        struct {
@@ -98,25 +133,54 @@ struct utcp_connection {
                uint32_t irs;
        } rcv;
 
-       utcp_recv_t recv;
+       int dupack;
+
+       // Timers
 
        struct timeval conn_timeout;
        struct timeval rtrx_timeout;
+       struct timeval rtt_start;
+       uint32_t rtt_seq;
+
+       // Buffers
+
+       struct buffer sndbuf;
+       struct buffer rcvbuf;
+       struct sack sacks[NSACKS];
+
+       // Per-socket options
+
+       bool nodelay;
+       bool keepalive;
+       bool shut_wr;
+
+       // Congestion avoidance state
 
-       char *sndbuf;
-       uint32_t sndbufsize;
-       uint32_t maxsndbufsize;
+       struct timeval tlast;
+       uint64_t bandwidth;
 };
 
 struct utcp {
        void *priv;
 
+       // Callbacks
+
        utcp_accept_t accept;
        utcp_pre_accept_t pre_accept;
        utcp_send_t send;
 
+       // Global socket options
+
        uint16_t mtu;
-       int timeout;
+       int timeout; // sec
+
+       // RTT variables
+
+       uint32_t srtt; // usec
+       uint32_t rttvar; // usec
+       uint32_t rto; // usec
+
+       // Connection management
 
        struct utcp_connection **connections;
        int nconnections;