Made the temporary buffer part of the TCP senddata() API, to ease the
[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/in.h>
14
15 struct tcp_connection;
16
17 /**
18  * TCP operations
19  *
20  */
21 struct tcp_operations {
22         /*
23          * Connection closed
24          *
25          * @v conn      TCP connection
26          * @v status    Error code, if any
27          *
28          * This is called when the connection is closed for any
29          * reason, including timeouts or aborts.  The status code
30          * contains the negative error number, if the closure is due
31          * to an error.
32          *
33          * Note that acked() and newdata() may be called after
34          * closed(), if the packet containing the FIN also
35          * acknowledged data or contained new data.  Note also that
36          * connected() may not have been called before closed(), if
37          * the close is due to an error.
38          */
39         void ( * closed ) ( struct tcp_connection *conn, int status );
40         /**
41          * Connection established (SYNACK received)
42          *
43          * @v conn      TCP connection
44          */
45         void ( * connected ) ( struct tcp_connection *conn );
46         /**
47          * Data acknowledged
48          *
49          * @v conn      TCP connection
50          * @v len       Length of acknowledged data
51          *
52          * @c len is guaranteed to not exceed the outstanding amount
53          * of unacknowledged data.
54          */
55         void ( * acked ) ( struct tcp_connection *conn, size_t len );
56         /**
57          * New data received
58          *
59          * @v conn      TCP connection
60          * @v data      Data
61          * @v len       Length of data
62          */
63         void ( * newdata ) ( struct tcp_connection *conn,
64                              void *data, size_t len );
65         /**
66          * Transmit data
67          *
68          * @v conn      TCP connection
69          * @v buf       Temporary data buffer
70          * @v len       Length of temporary data buffer
71          *
72          * The application should transmit whatever it currently wants
73          * to send using tcp_send().  If retransmissions are required,
74          * senddata() will be called again and the application must
75          * regenerate the data.  The easiest way to implement this is
76          * to ensure that senddata() never changes the application's
77          * state.
78          *
79          * The application may use the temporary data buffer to
80          * construct the data to be sent.  Note that merely filling
81          * the buffer will do nothing; the application must call
82          * tcp_send() in order to actually transmit the data.  Use of
83          * the buffer is not compulsory; the application may call
84          * tcp_send() on any block of data.
85          */
86         void ( * senddata ) ( struct tcp_connection *conn, void *buf,
87                               size_t len );
88 };
89
90 /**
91  * A TCP connection
92  *
93  */
94 struct tcp_connection {
95         /** Address of the remote end of the connection */
96         struct sockaddr_in sin;
97         /** Operations table for this connection */
98         struct tcp_operations *tcp_op;
99 };
100
101 extern void tcp_connect ( struct tcp_connection *conn );
102 extern void tcp_send ( struct tcp_connection *conn, const void *data,
103                        size_t len );
104 extern void tcp_kick ( struct tcp_connection *conn );
105 extern void tcp_close ( struct tcp_connection *conn );
106
107 #endif /* _GPXE_TCP_H */