Make the UDP senddata() methods return a status code.
[people/andreif/gpxe.git] / src / include / gpxe / udp.h
1 #ifndef _GPXE_UDP_H
2 #define _GPXE_UDP_H
3
4 /** @file
5  *
6  * UDP protocol
7  *
8  * This file defines the gPXE UDP API.
9  *
10  */
11
12 #include <stddef.h>
13 #include <gpxe/pkbuff.h>
14 #include <gpxe/tcpip.h>
15 #include <gpxe/if_ether.h>
16
17 /**
18  * UDP constants
19  */
20
21 #define UDP_MAX_HLEN    72
22 #define UDP_MAX_TXPKB   ETH_MAX_MTU
23 #define UDP_MIN_TXPKB   ETH_ZLEN
24
25 typedef uint16_t port_t;
26
27 /**
28  * A UDP header
29  */
30 struct udp_header {
31         port_t source_port;
32         port_t dest_port;
33         uint16_t len;
34         uint16_t chksum;
35 };
36
37 struct udp_connection;
38
39 /**
40  * UDP operations
41  *
42  */
43 struct udp_operations {
44         
45         /**
46          * Transmit data
47          *
48          * @v conn      UDP connection
49          * @v buf       Temporary data buffer
50          * @v len       Length of temporary data buffer
51          * @ret rc      Return status code
52          *
53          * The application may use the temporary data buffer to
54          * construct the data to be sent.  Note that merely filling
55          * the buffer will do nothing; the application must call
56          * udp_send() in order to actually transmit the data.  Use of
57          * the buffer is not compulsory; the application may call
58          * udp_send() on any block of data.
59          */
60         int ( * senddata ) ( struct udp_connection *conn, void *buf,
61                              size_t len );
62         /**
63          * New data received
64          *
65          * @v conn      UDP connection
66          * @v data      Data
67          * @v len       Length of data
68          * @v st_src    Source address
69          * @v st_dest   Destination address
70          * @ret rc      Return status code
71          */
72         int ( * newdata ) ( struct udp_connection *conn, void *data,
73                             size_t len, struct sockaddr_tcpip *st_src,
74                             struct sockaddr_tcpip *st_dest );
75 };
76
77 /**
78  * A UDP connection
79  *
80  */
81 struct udp_connection {
82        /** Address of the remote end of the connection */
83         struct sockaddr_tcpip peer;
84         /** Local port on which the connection receives packets */
85         port_t local_port;
86         /** Transmit buffer */
87         struct pk_buff *tx_pkb;
88         /** List of registered connections */
89         struct list_head list;
90         /** Operations table for this connection */
91         struct udp_operations *udp_op;
92 };
93
94 /*
95  * Functions provided to the application layer
96  */
97
98 extern int udp_bind ( struct udp_connection *conn, uint16_t local_port );
99 extern void udp_bind_promisc ( struct udp_connection *conn );
100 extern void udp_connect ( struct udp_connection *conn,
101                           struct sockaddr_tcpip *peer );
102 extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
103 extern void udp_close ( struct udp_connection *conn );
104
105 extern int udp_senddata ( struct udp_connection *conn );
106 extern int udp_send ( struct udp_connection *conn,
107                       const void *data, size_t len );
108 extern int udp_sendto ( struct udp_connection *conn,
109                         struct sockaddr_tcpip *peer,
110                         const void *data, size_t len );
111
112 #endif /* _GPXE_UDP_H */