summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/include/netinet/tcp.h
blob: e47f24dff0ecf215a94c5c9bb0d45899a6f7097f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#ifndef _NETINET_TCP_H
#define _NETINET_TCP_H

#include <inttypes.h>
#include <endian.h>

struct tcphdr {		/* size 20/0x14      40/0x28 with IP header */
  uint16_t source;	/* offset 0          20/0x14 */
  uint16_t dest;	/* offset 2          22/0x16 */
  uint32_t seq;		/* offset 4          24/0x18 */
  uint32_t ack_seq;	/* offset 8          28/0x1c */
#if __BYTE_ORDER == __LITTLE_ENDIAN
  uint16_t res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, ece:1, cwr:1;
#else
  uint16_t doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;
#endif
			/* offset 12/0xc     32/0x20 */
  uint16_t window;	/* offset 14/0xe     34/0x22 */
  uint16_t check;	/* offset 16/0x10    36/0x24 */
  uint16_t urg_ptr;	/* offset 18/0x12    38/0x26 */
};


enum {
  TCP_ESTABLISHED = 1,
  TCP_SYN_SENT,
  TCP_SYN_RECV,
  TCP_FIN_WAIT1,
  TCP_FIN_WAIT2,
  TCP_TIME_WAIT,
  TCP_CLOSE,
  TCP_CLOSE_WAIT,
  TCP_LAST_ACK,
  TCP_LISTEN,
  TCP_CLOSING,	 /* now a valid state */

  TCP_MAX_STATES /* Leave at the end! */
};

#define TCP_STATE_MASK 0xF
#define TCP_ACTION_FIN (1 << 7)

enum {
  TCPF_ESTABLISHED = (1 << 1),
  TCPF_SYN_SENT  = (1 << 2),
  TCPF_SYN_RECV  = (1 << 3),
  TCPF_FIN_WAIT1 = (1 << 4),
  TCPF_FIN_WAIT2 = (1 << 5),
  TCPF_TIME_WAIT = (1 << 6),
  TCPF_CLOSE     = (1 << 7),
  TCPF_CLOSE_WAIT = (1 << 8),
  TCPF_LAST_ACK  = (1 << 9),
  TCPF_LISTEN    = (1 << 10),
  TCPF_CLOSING   = (1 << 11)
};

/*
 *	The union cast uses a gcc extension to avoid aliasing problems
 *  (union is compatible to any of its members)
 *  This means this part of the code is -fstrict-aliasing safe now.
 */
union tcp_word_hdr {
  struct tcphdr hdr;
  uint32_t words[5];
};

#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3]) 

enum {
#if __BYTE_ORDER == __LITTLE_ENDIAN
  TCP_FLAG_CWR = 0x00008000,
  TCP_FLAG_ECE = 0x00004000,
  TCP_FLAG_URG = 0x00002000,
  TCP_FLAG_ACK = 0x00001000,
  TCP_FLAG_PSH = 0x00000800,
  TCP_FLAG_RST = 0x00000400,
  TCP_FLAG_SYN = 0x00000200,
  TCP_FLAG_FIN = 0x00000100,
  TCP_RESERVED_BITS = 0x0000C00F,
  TCP_DATA_OFFSET = 0x000000F0
#else
  TCP_FLAG_CWR = 0x00800000,
  TCP_FLAG_ECE = 0x00400000,
  TCP_FLAG_URG = 0x00200000,
  TCP_FLAG_ACK = 0x00100000,
  TCP_FLAG_PSH = 0x00080000,
  TCP_FLAG_RST = 0x00040000,
  TCP_FLAG_SYN = 0x00020000,
  TCP_FLAG_FIN = 0x00010000,
  TCP_RESERVED_BITS = 0x0FC00000,
  TCP_DATA_OFFSET = 0xF0000000
#endif
};

/* TCP socket options */
#define TCP_NODELAY		1	/* Turn off Nagle's algorithm. */
#define TCP_MAXSEG		2	/* Limit MSS */
#define TCP_CORK		3	/* Never send partially complete segments */
#define TCP_KEEPIDLE		4	/* Start keeplives after this period */
#define TCP_KEEPINTVL		5	/* Interval between keepalives */
#define TCP_KEEPCNT		6	/* Number of keepalives before death */
#define TCP_SYNCNT		7	/* Number of SYN retransmits */
#define TCP_LINGER2		8	/* Life time of orphaned FIN-WAIT-2 state */
#define TCP_DEFER_ACCEPT	9	/* Wake up listener only when data arrive */
#define TCP_WINDOW_CLAMP	10	/* Bound advertised window */
#define TCP_INFO		11	/* Information about this connection. */
#define TCP_QUICKACK		12	/* Block/reenable quick acks */

#define TCPI_OPT_TIMESTAMPS	1
#define TCPI_OPT_SACK		2
#define TCPI_OPT_WSCALE		4
#define TCPI_OPT_ECN		8

enum tcp_ca_state {
  TCP_CA_Open = 0,
#define TCPF_CA_Open	(1<<TCP_CA_Open)
  TCP_CA_Disorder = 1,
#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
  TCP_CA_CWR = 2,
#define TCPF_CA_CWR	(1<<TCP_CA_CWR)
  TCP_CA_Recovery = 3,
#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
  TCP_CA_Loss = 4
#define TCPF_CA_Loss	(1<<TCP_CA_Loss)
};

struct tcp_info {
  uint8_t tcpi_state;
  uint8_t tcpi_ca_state;
  uint8_t tcpi_retransmits;
  uint8_t tcpi_probes;
  uint8_t tcpi_backoff;
  uint8_t tcpi_options;
  uint8_t tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;

  uint32_t tcpi_rto;
  uint32_t tcpi_ato;
  uint32_t tcpi_snd_mss;
  uint32_t tcpi_rcv_mss;

  uint32_t tcpi_unacked;
  uint32_t tcpi_sacked;
  uint32_t tcpi_lost;
  uint32_t tcpi_retrans;
  uint32_t tcpi_fackets;

  /* Times. */
  uint32_t tcpi_last_data_sent;
  uint32_t tcpi_last_ack_sent;     /* Not remembered, sorry. */
  uint32_t tcpi_last_data_recv;
  uint32_t tcpi_last_ack_recv;

  /* Metrics. */
  uint32_t tcpi_pmtu;
  uint32_t tcpi_rcv_ssthresh;
  uint32_t tcpi_rtt;
  uint32_t tcpi_rttvar;
  uint32_t tcpi_snd_ssthresh;
  uint32_t tcpi_snd_cwnd;
  uint32_t tcpi_advmss;
  uint32_t tcpi_reordering;
};

#endif