006bc0b3862ace825740d79fa7fbe4ee0163e553
[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/in.h>
14 #include <gpxe/pkbuff.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          */
68         void ( * newdata ) ( struct udp_connection *conn,
69                              void *data, size_t len );
70 };
71
72 /**
73  * A UDP connection
74  *
75  */
76 struct udp_connection {
77        /** Address of the remote end of the connection */
78         struct sockaddr sa;
79         /** Local port on which the connection receives packets */
80         port_t local_port;
81         /** Transmit buffer */
82         struct pk_buff *tx_pkb;
83         /** List of registered connections */
84         struct list_head list;
85         /** Operations table for this connection */
86         struct udp_operations *udp_op;
87 };
88
89 /**
90  * UDP protocol
91  */
92 extern struct tcpip_protocol udp_protocol;
93
94 /**
95  * Functions provided to the application layer
96  */
97
98 extern void udp_init ( struct udp_connection *conn, struct udp_operations *udp_op );
99 extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
100
101 extern void udp_connect ( struct udp_connection *conn, struct sockaddr *peer );
102 extern void udp_close ( struct udp_connection *conn );
103
104 extern int udp_senddata ( struct udp_connection *conn );
105 extern int udp_send ( struct udp_connection *conn, const void *data, size_t len );
106 extern int udp_sendto ( struct udp_connection *conn, struct sockaddr *peer, const void *data, size_t len );
107
108 static inline void * udp_buffer ( struct udp_connection *conn ) {
109         return conn->tx_pkb->data;
110 }
111
112 static inline int udp_buflen ( struct udp_connection *conn ) {
113         return pkb_len ( conn->tx_pkb );
114 }
115
116 #endif /* _GPXE_UDP_H */