9bc3cc4a7c7524cf1927019edb297a681bb758b2
[gpxe.git] / src / include / gpxe / tcpip.h
1 #ifndef _GPXE_TCPIP_H
2 #define _GPXE_TCPIP_H
3
4 /** @file
5  *
6  * Transport-network layer interface
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/socket.h>
12 #include <gpxe/in.h>
13 #include <gpxe/tables.h>
14
15 struct io_buffer;
16 struct net_device;
17
18 /** Empty checksum value
19  *
20  * This is the TCP/IP checksum over a zero-length block of data.
21  */
22 #define TCPIP_EMPTY_CSUM 0xffff
23
24 /**
25  * TCP/IP socket address
26  *
27  * This contains the fields common to socket addresses for all TCP/IP
28  * address families.
29  */
30 struct sockaddr_tcpip {
31         /** Socket address family (part of struct @c sockaddr) */
32         sa_family_t st_family;
33         /** TCP/IP port */
34         uint16_t st_port;
35         /** Padding
36          *
37          * This ensures that a struct @c sockaddr_tcpip is large
38          * enough to hold a socket address for any TCP/IP address
39          * family.
40          */
41         char pad[ sizeof ( struct sockaddr ) -
42                   ( sizeof ( sa_family_t ) + sizeof ( uint16_t ) ) ];
43 } __attribute__ (( may_alias ));
44
45 /** 
46  * A transport-layer protocol of the TCP/IP stack (eg. UDP, TCP, etc)
47  */
48 struct tcpip_protocol {
49         /** Protocol name */
50         const char *name;
51         /**
52          * Process received packet
53          *
54          * @v iobuf             I/O buffer
55          * @v st_src            Partially-filled source address
56          * @v st_dest           Partially-filled destination address
57          * @v pshdr_csum        Pseudo-header checksum
58          * @ret rc              Return status code
59          *
60          * This method takes ownership of the I/O buffer.
61          */
62         int ( * rx ) ( struct io_buffer *iobuf, struct sockaddr_tcpip *st_src,
63                        struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
64         /** 
65          * Transport-layer protocol number
66          *
67          * This is a constant of the type IP_XXX
68          */
69         uint8_t tcpip_proto;
70 };
71
72 /**
73  * A network-layer protocol of the TCP/IP stack (eg. IPV4, IPv6, etc)
74  */
75 struct tcpip_net_protocol {
76         /** Protocol name */
77         const char *name;
78         /** Network address family */
79         sa_family_t sa_family;
80         /**
81          * Transmit packet
82          *
83          * @v iobuf             I/O buffer
84          * @v tcpip_protocol    Transport-layer protocol
85          * @v st_dest           Destination address
86          * @v netdev            Network device (or NULL to route automatically)
87          * @v trans_csum        Transport-layer checksum to complete, or NULL
88          * @ret rc              Return status code
89          *
90          * This function takes ownership of the I/O buffer.
91          */
92         int ( * tx ) ( struct io_buffer *iobuf,
93                        struct tcpip_protocol *tcpip_protocol,
94                        struct sockaddr_tcpip *st_dest,
95                        struct net_device *netdev,
96                        uint16_t *trans_csum );
97 };
98
99 /** Declare a TCP/IP transport-layer protocol */
100 #define __tcpip_protocol \
101         __table ( struct tcpip_protocol, tcpip_protocols, 01 )
102
103 /** Declare a TCP/IP network-layer protocol */
104 #define __tcpip_net_protocol \
105         __table ( struct tcpip_net_protocol, tcpip_net_protocols, 01 )
106
107 extern int tcpip_rx ( struct io_buffer *iobuf, uint8_t tcpip_proto,
108                       struct sockaddr_tcpip *st_src,
109                       struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
110 extern int tcpip_tx ( struct io_buffer *iobuf, struct tcpip_protocol *tcpip, 
111                       struct sockaddr_tcpip *st_dest,
112                       struct net_device *netdev,
113                       uint16_t *trans_csum );
114 extern uint16_t tcpip_continue_chksum ( uint16_t partial,
115                                         const void *data, size_t len );
116 extern uint16_t tcpip_chksum ( const void *data, size_t len );
117
118 #endif /* _GPXE_TCPIP_H */