e6511160cca4f780214e09ae097546277e29069f
[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          * New data received
46          *
47          * @v conn      UDP connection
48          * @v data      Data
49          * @v len       Length of data
50          */
51         void ( * newdata ) ( struct udp_connection *conn,
52                              void *data, size_t len );
53 };
54
55 /**
56  * A UDP connection
57  *
58  */
59 struct udp_connection {
60        /** Address of the remote end of the connection */
61         struct sockaddr sin;
62         /** Local port on which the connection receives packets */
63         port_t local_port;
64         /** Transmit buffer */
65         struct pk_buff *tx_pkb;
66         /** List of registered connections */
67         struct list_head list;
68         /** Operations table for this connection */
69         struct udp_operations *udp_op;
70 };
71
72 /**
73  * List of registered UDP connections
74  */
75 static LIST_HEAD ( udp_conns );
76
77 /**
78  * UDP protocol
79  */
80 extern struct tcpip_protocol udp_protocol;
81
82 /**
83  * Functions provided to the application layer
84  */
85
86 extern void udp_init ( struct udp_connection *conn, struct udp_operations *udp_op );
87 extern int udp_open ( struct udp_connection *conn, uint16_t local_port );
88
89 extern void udp_connect ( struct udp_connection *conn, struct sockaddr *peer );
90 extern void udp_close ( struct udp_connection *conn );
91
92 extern int udp_send ( struct udp_connection *conn, const void *data, size_t len );
93 extern int udp_sendto ( struct udp_connection *conn, struct sockaddr *peer, const void *data, size_t len );
94
95 static inline void * udp_buffer ( struct udp_connection *conn ) {
96         return conn->tx_pkb->data;
97 }
98
99 static inline int udp_buflen ( struct udp_connection *conn ) {
100         return pkb_len ( conn->tx_pkb );
101 }
102
103 #endif /* _GPXE_UDP_H */