Moved uIP wrapper out of prototester.c and into proto/tcp.c.
[people/xl0/gpxe.git] / src / include / gpxe / tcp.h
1 #ifndef _TCP_H
2 #define _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 aborted (RST received)
24          *
25          * @v conn      TCP connection
26          */
27         void ( * aborted ) ( struct tcp_connection *conn );
28         /**
29          * Connection timed out
30          *
31          * @v conn      TCP connection
32          */
33         void ( * timedout ) ( struct tcp_connection *conn );
34         /**
35          * Connection aborted (FIN received)
36          *
37          * @v conn      TCP connection
38          *
39          * Note that acked() and newdata() may be called after
40          * closed(), if the packet containing the FIN also
41          * acknowledged data or contained new data.
42          */
43         void ( * closed ) ( struct tcp_connection *conn );
44         /**
45          * Connection established (SYNACK received)
46          *
47          * @v conn      TCP connection
48          */
49         void ( * connected ) ( struct tcp_connection *conn );
50         /**
51          * Data acknowledged
52          *
53          * @v conn      TCP connection
54          * @v len       Length of acknowledged data
55          *
56          * @c len is guaranteed to not exceed the outstanding amount
57          * of unacknowledged data.
58          */
59         void ( * acked ) ( struct tcp_connection *conn, size_t len );
60         /**
61          * New data received
62          *
63          * @v conn      TCP connection
64          * @v data      Data
65          * @v len       Length of data
66          */
67         void ( * newdata ) ( struct tcp_connection *conn,
68                              void *data, size_t len );
69         /**
70          * Transmit data
71          *
72          * @v conn      TCP connection
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         void ( * senddata ) ( struct tcp_connection *conn );
82 };
83
84 /**
85  * A TCP connection
86  *
87  */
88 struct tcp_connection {
89         /** Address of the remote end of the connection */
90         struct sockaddr_in sin;
91         /** Operations table for this connection */
92         struct tcp_operations *tcp_op;
93 };
94
95 extern int tcp_connect ( struct tcp_connection *conn );
96 extern void tcp_send ( struct tcp_connection *conn, const void *data,
97                        size_t len );
98 extern void tcp_close ( struct tcp_connection *conn );
99 extern void init_tcpip ( void );
100 extern void run_tcpip ( void );
101
102 #endif /* _TCP_H */