Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. #ifndef _NETINET_TCP_H
  2. #define _NETINET_TCP_H
  3.  
  4. #include <inttypes.h>
  5. #include <endian.h>
  6.  
  7. __BEGIN_DECLS
  8.  
  9. struct tcphdr {         /* size 20/0x14      40/0x28 with IP header */
  10.   uint16_t source;      /* offset 0          20/0x14 */
  11.   uint16_t dest;        /* offset 2          22/0x16 */
  12.   uint32_t seq;         /* offset 4          24/0x18 */
  13.   uint32_t ack_seq;     /* offset 8          28/0x1c */
  14. #if __BYTE_ORDER == __LITTLE_ENDIAN
  15.   uint16_t res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;
  16. #else
  17.   uint16_t doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;
  18. #endif
  19.                         /* offset 12/0xc     32/0x20 */
  20.   uint16_t window;      /* offset 14/0xe     34/0x22 */
  21.   uint16_t check;       /* offset 16/0x10    36/0x24 */
  22.   uint16_t urg_ptr;     /* offset 18/0x12    38/0x26 */
  23. };
  24.  
  25.  
  26. enum {
  27.   TCP_ESTABLISHED = 1,
  28.   TCP_SYN_SENT,
  29.   TCP_SYN_RECV,
  30.   TCP_FIN_WAIT1,
  31.   TCP_FIN_WAIT2,
  32.   TCP_TIME_WAIT,
  33.   TCP_CLOSE,
  34.   TCP_CLOSE_WAIT,
  35.   TCP_LAST_ACK,
  36.   TCP_LISTEN,
  37.   TCP_CLOSING,   /* now a valid state */
  38.  
  39.   TCP_MAX_STATES /* Leave at the end! */
  40. };
  41.  
  42. #define TCP_STATE_MASK 0xF
  43. #define TCP_ACTION_FIN (1 << 7)
  44.  
  45. enum {
  46.   TCPF_ESTABLISHED = (1 << 1),
  47.   TCPF_SYN_SENT  = (1 << 2),
  48.   TCPF_SYN_RECV  = (1 << 3),
  49.   TCPF_FIN_WAIT1 = (1 << 4),
  50.   TCPF_FIN_WAIT2 = (1 << 5),
  51.   TCPF_TIME_WAIT = (1 << 6),
  52.   TCPF_CLOSE     = (1 << 7),
  53.   TCPF_CLOSE_WAIT = (1 << 8),
  54.   TCPF_LAST_ACK  = (1 << 9),
  55.   TCPF_LISTEN    = (1 << 10),
  56.   TCPF_CLOSING   = (1 << 11)
  57. };
  58.  
  59. /*
  60.  *      The union cast uses a gcc extension to avoid aliasing problems
  61.  *  (union is compatible to any of its members)
  62.  *  This means this part of the code is -fstrict-aliasing safe now.
  63.  */
  64. union tcp_word_hdr {
  65.   struct tcphdr hdr;
  66.   uint32_t words[5];
  67. };
  68.  
  69. #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])
  70.  
  71. enum {
  72. #if __BYTE_ORDER == __LITTLE_ENDIAN
  73.   TCP_FLAG_CWR = 0x00008000,
  74.   TCP_FLAG_ECE = 0x00004000,
  75.   TCP_FLAG_URG = 0x00002000,
  76.   TCP_FLAG_ACK = 0x00001000,
  77.   TCP_FLAG_PSH = 0x00000800,
  78.   TCP_FLAG_RST = 0x00000400,
  79.   TCP_FLAG_SYN = 0x00000200,
  80.   TCP_FLAG_FIN = 0x00000100,
  81.   TCP_RESERVED_BITS = 0x0000C00F,
  82.   TCP_DATA_OFFSET = 0x000000F0
  83. #else
  84.   TCP_FLAG_CWR = 0x00800000,
  85.   TCP_FLAG_ECE = 0x00400000,
  86.   TCP_FLAG_URG = 0x00200000,
  87.   TCP_FLAG_ACK = 0x00100000,
  88.   TCP_FLAG_PSH = 0x00080000,
  89.   TCP_FLAG_RST = 0x00040000,
  90.   TCP_FLAG_SYN = 0x00020000,
  91.   TCP_FLAG_FIN = 0x00010000,
  92.   TCP_RESERVED_BITS = 0x0FC00000,
  93.   TCP_DATA_OFFSET = 0xF0000000
  94. #endif
  95. };
  96.  
  97. /* TCP socket options */
  98. #define TCP_NODELAY             1       /* Turn off Nagle's algorithm. */
  99. #define TCP_MAXSEG              2       /* Limit MSS */
  100. #define TCP_CORK                3       /* Never send partially complete segments */
  101. #define TCP_KEEPIDLE            4       /* Start keeplives after this period */
  102. #define TCP_KEEPINTVL           5       /* Interval between keepalives */
  103. #define TCP_KEEPCNT             6       /* Number of keepalives before death */
  104. #define TCP_SYNCNT              7       /* Number of SYN retransmits */
  105. #define TCP_LINGER2             8       /* Life time of orphaned FIN-WAIT-2 state */
  106. #define TCP_DEFER_ACCEPT        9       /* Wake up listener only when data arrive */
  107. #define TCP_WINDOW_CLAMP        10      /* Bound advertised window */
  108. #define TCP_INFO                11      /* Information about this connection. */
  109. #define TCP_QUICKACK            12      /* Block/reenable quick acks */
  110.  
  111. #define TCPI_OPT_TIMESTAMPS     1
  112. #define TCPI_OPT_SACK           2
  113. #define TCPI_OPT_WSCALE         4
  114. #define TCPI_OPT_ECN            8
  115.  
  116. enum tcp_ca_state {
  117.   TCP_CA_Open = 0,
  118. #define TCPF_CA_Open    (1<<TCP_CA_Open)
  119.   TCP_CA_Disorder = 1,
  120. #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
  121.   TCP_CA_CWR = 2,
  122. #define TCPF_CA_CWR     (1<<TCP_CA_CWR)
  123.   TCP_CA_Recovery = 3,
  124. #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
  125.   TCP_CA_Loss = 4
  126. #define TCPF_CA_Loss    (1<<TCP_CA_Loss)
  127. };
  128.  
  129. struct tcp_info {
  130.   uint8_t tcpi_state;
  131.   uint8_t tcpi_ca_state;
  132.   uint8_t tcpi_retransmits;
  133.   uint8_t tcpi_probes;
  134.   uint8_t tcpi_backoff;
  135.   uint8_t tcpi_options;
  136.   uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
  137.  
  138.   uint32_t tcpi_rto;
  139.   uint32_t tcpi_ato;
  140.   uint32_t tcpi_snd_mss;
  141.   uint32_t tcpi_rcv_mss;
  142.  
  143.   uint32_t tcpi_unacked;
  144.   uint32_t tcpi_sacked;
  145.   uint32_t tcpi_lost;
  146.   uint32_t tcpi_retrans;
  147.   uint32_t tcpi_fackets;
  148.  
  149.   /* Times. */
  150.   uint32_t tcpi_last_data_sent;
  151.   uint32_t tcpi_last_ack_sent;     /* Not remembered, sorry. */
  152.   uint32_t tcpi_last_data_recv;
  153.   uint32_t tcpi_last_ack_recv;
  154.  
  155.   /* Metrics. */
  156.   uint32_t tcpi_pmtu;
  157.   uint32_t tcpi_rcv_ssthresh;
  158.   uint32_t tcpi_rtt;
  159.   uint32_t tcpi_rttvar;
  160.   uint32_t tcpi_snd_ssthresh;
  161.   uint32_t tcpi_snd_cwnd;
  162.   uint32_t tcpi_advmss;
  163.   uint32_t tcpi_reordering;
  164. };
  165.  
  166. __END_DECLS
  167.  
  168. #endif
  169.