Added features that will be required for PXE UDP support.
[gpxe.git] / src / include / gpxe / tcp.h
1 #ifndef _GPXE_TCP_H
2 #define _GPXE_TCP_H
3
4 /** @file
5  *
6  * TCP protocol
7  *
8  * This file defines the gPXE TCP API.
9  *
10  */
11
12 #include <stddef.h>
13 #include <gpxe/list.h>
14 #include <gpxe/tcpip.h>
15 #include <gpxe/pkbuff.h>
16
17 struct tcp_connection;
18
19 /**
20  * TCP operations
21  *
22  */
23 struct tcp_operations {
24         /*
25          * Connection closed
26          *
27          * @v conn      TCP connection
28          * @v status    Error code, if any
29          *
30          * This is called when the connection is closed for any
31          * reason, including timeouts or aborts.  The status code
32          * contains the negative error number, if the closure is due
33          * to an error.
34          *
35          * Note that acked() and newdata() may be called after
36          * closed(), if the packet containing the FIN also
37          * acknowledged data or contained new data.  Note also that
38          * connected() may not have been called before closed(), if
39          * the close is due to an error.
40          */
41         void ( * closed ) ( struct tcp_connection *conn, int status );
42         /**
43          * Connection established (SYNACK received)
44          *
45          * @v conn      TCP connection
46          */
47         void ( * connected ) ( struct tcp_connection *conn );
48         /**
49          * Data acknowledged
50          *
51          * @v conn      TCP connection
52          * @v len       Length of acknowledged data
53          *
54          * @c len is guaranteed to not exceed the outstanding amount
55          * of unacknowledged data.
56          */
57         void ( * acked ) ( struct tcp_connection *conn, size_t len );
58         /**
59          * New data received
60          *
61          * @v conn      TCP connection
62          * @v data      Data
63          * @v len       Length of data
64          */
65         void ( * newdata ) ( struct tcp_connection *conn,
66                              void *data, size_t len );
67         /**
68          * Transmit data
69          *
70          * @v conn      TCP connection
71          * @v buf       Temporary data buffer
72          * @v len       Length of temporary data buffer
73          *
74          * The application should transmit whatever it currently wants
75          * to send using tcp_send().  If retransmissions are required,
76          * senddata() will be called again and the application must
77          * regenerate the data.  The easiest way to implement this is
78          * to ensure that senddata() never changes the application's
79          * state.
80          *
81          * The application may use the temporary data buffer to
82          * construct the data to be sent.  Note that merely filling
83          * the buffer will do nothing; the application must call
84          * tcp_send() in order to actually transmit the data.  Use of
85          * the buffer is not compulsory; the application may call
86          * tcp_send() on any block of data.
87          */
88         void ( * senddata ) ( struct tcp_connection *conn, void *buf,
89                               size_t len );
90 };
91
92 #if USE_UIP
93
94 /**
95  * A TCP connection
96  *
97  */
98 struct tcp_connection {
99         /** Address of the remote end of the connection */
100         struct sockaddr_in sin;
101         /** Operations table for this connection */
102         struct tcp_operations *tcp_op;
103 };
104
105 extern void tcp_connect ( struct tcp_connection *conn );
106 extern void tcp_send ( struct tcp_connection *conn, const void *data,
107                        size_t len );
108 extern void tcp_kick ( struct tcp_connection *conn );
109 extern void tcp_close ( struct tcp_connection *conn );
110
111 #else
112
113 #define TCP_NOMSG ""
114 #define TCP_NOMSG_LEN 0
115
116 /* Smallest port number on which a TCP connection can listen */
117 #define TCP_MIN_PORT 1
118
119 /* Some PKB constants */
120 #define MAX_HDR_LEN     100
121 #define MAX_PKB_LEN     1500
122 #define MIN_PKB_LEN     MAX_HDR_LEN + 100 /* To account for padding by LL */
123
124 /**
125  * TCP states
126  */
127 #define TCP_CLOSED      0
128 #define TCP_LISTEN      1
129 #define TCP_SYN_SENT    2
130 #define TCP_SYN_RCVD    3
131 #define TCP_ESTABLISHED 4
132 #define TCP_FIN_WAIT_1  5
133 #define TCP_FIN_WAIT_2  6
134 #define TCP_CLOSING     7
135 #define TCP_TIME_WAIT   8
136 #define TCP_CLOSE_WAIT  9
137 #define TCP_LAST_ACK    10
138
139 #define TCP_INVALID     11
140
141 /**
142  * A TCP connection
143  */
144 struct tcp_connection {
145         struct sockaddr_tcpip peer;     /* Remote socket address */
146
147         /* FIXME: this field should no longer be present */
148         struct sockaddr_in sin;
149
150         uint16_t local_port;            /* Local port, in network byte order */
151         int tcp_state;                  /* TCP state */
152         int tcp_lstate;                 /* Last TCP state */
153         uint32_t snd_una;               /* Lowest unacked byte on snd stream */
154         uint32_t snd_win;               /* Offered by remote end */
155         uint32_t rcv_nxt;               /* Next expected byte on rcv stream */
156         uint32_t rcv_win;               /* Advertised to receiver */
157         uint8_t tcp_flags;              /* TCP header flags */
158         struct list_head list;          /* List of TCP connections */
159         struct pk_buff *tx_pkb;         /* Transmit packet buffer */
160         struct tcp_operations *tcp_op;  /* Operations table for connection */
161 };
162
163 /**
164  * Connection closed status codes
165  */
166 #define CONN_SNDCLOSE   0
167 #define CONN_RESTART    1
168 #define CONN_TIMEOUT    2
169 #define CONN_RCVCLOSE   3
170
171 /**
172  * A TCP header
173  */
174 struct tcp_header {
175         uint16_t src;           /* Source port */
176         uint16_t dest;          /* Destination port */
177         uint32_t seq;           /* Sequence number */
178         uint32_t ack;           /* Acknowledgement number */
179         uint8_t hlen;           /* Header length (4), Reserved (4) */
180         uint8_t flags;          /* Reserved (2), Flags (6) */
181         uint16_t win;           /* Advertised window */
182         uint16_t csum;          /* Checksum */
183         uint16_t urg;           /* Urgent pointer */
184 };
185
186 /**
187  * TCP masks
188  */
189 #define TCP_MASK_HLEN   0xf0
190 #define TCP_MASK_FLAGS  0x3f
191
192 /**
193  * TCP flags
194  */
195 #define TCP_RST         0x20
196 #define TCP_ACK         0x10
197 #define TCP_PSH         0x08
198 #define TCP_URG         0x04
199 #define TCP_SYN         0x02
200 #define TCP_FIN         0x01
201
202 extern struct tcpip_protocol tcp_protocol;
203
204 extern void tcp_init_conn ( struct tcp_connection *conn );
205 extern int tcp_connect ( struct tcp_connection *conn );
206 extern int tcp_connectto ( struct tcp_connection *conn,
207                            struct sockaddr_tcpip *peer );
208 extern int tcp_listen ( struct tcp_connection *conn, uint16_t port );
209 extern int tcp_senddata ( struct tcp_connection *conn );
210 extern int tcp_close ( struct tcp_connection *conn );
211
212 extern int tcp_send ( struct tcp_connection *conn, const void *data, 
213                       size_t len );
214
215 #endif /* USE_UIP */
216
217 #endif /* _GPXE_TCP_H */