0104cc06710671e6ffaf6d1c008b6680bbaf28ef
[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          *
52          * The application may use the temporary data buffer to
53          * construct the data to be sent.  Note that merely filling
54          * the buffer will do nothing; the application must call
55          * udp_send() in order to actually transmit the data.  Use of
56          * the buffer is not compulsory; the application may call
57          * udp_send() on any block of data.
58          */
59         void ( * senddata ) ( struct udp_connection *conn, void *buf,
60                               size_t len );
61         /**
62          * New data received
63          *
64          * @v conn      UDP connection
65          * @v data      Data
66          * @v len       Length of data
67          * @v st_src    Source address
68          * @v st_dest   Destination address
69          * @ret rc      Return status code
70          */
71         int ( * newdata ) ( struct udp_connection *conn, void *data,
72                             size_t len, struct sockaddr_tcpip *st_src,
73                             struct sockaddr_tcpip *st_dest );
74 };
75
76 /**
77  * A UDP connection
78  *
79  */
80 struct udp_connection {
81        /** Address of the remote end of the connection */
82         struct sockaddr_tcpip peer;
83         /** Local port on which the connection receives packets */
84         port_t local_port;
85         /** Transmit buffer */
86         struct pk_buff *tx_pkb;
87         /** List of registered connections */
88         struct list_head list;
89         /** Operations table for this connection */
90         struct udp_operations *udp_op;
91 };
92
93 /*
94  * Functions provided to the application layer
95  */
96
97 extern int udp_bind ( struct udp_connection *conn, uint16_t local_port );
98 extern void udp_bind_promisc ( struct udp_connection *conn );
99 extern void udp_connect ( struct udp_connection *conn,
100                           struct sockaddr_tcpip *peer );
101 extern void udp_connect_promisc ( struct udp_connection *conn );
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 */