Allow an explicit network device to be specified for IP-layer
[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 pk_buff;
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 /** Length of a @c struct @c sockaddr_tcpip */
25 #define SA_TCPIP_LEN 32
26
27 /**
28  * TCP/IP socket address
29  *
30  * This contains the fields common to socket addresses for all TCP/IP
31  * address families.
32  */
33 struct sockaddr_tcpip {
34         /** Socket address family (part of struct @c sockaddr) */
35         sa_family_t st_family;
36         /** TCP/IP port */
37         uint16_t st_port;
38         /** Padding
39          *
40          * This ensures that a struct @c sockaddr_tcpip is large
41          * enough to hold a socket address for any TCP/IP address
42          * family.
43          */
44         char pad[SA_TCPIP_LEN - sizeof ( sa_family_t ) - sizeof ( uint16_t )];
45 };
46
47 /** 
48  * A transport-layer protocol of the TCP/IP stack (eg. UDP, TCP, etc)
49  */
50 struct tcpip_protocol {
51         /** Protocol name */
52         const char *name;
53         /**
54          * Process received packet
55          *
56          * @v pkb               Packet buffer
57          * @v st_src            Partially-filled source address
58          * @v st_dest           Partially-filled destination address
59          * @v pshdr_csum        Pseudo-header checksum
60          * @ret rc              Return status code
61          *
62          * This method takes ownership of the packet buffer.
63          */
64         int ( * rx ) ( struct pk_buff *pkb, struct sockaddr_tcpip *st_src,
65                        struct sockaddr_tcpip *st_dest, uint16_t pshdr_csum );
66         /** 
67          * Transport-layer protocol number
68          *
69          * This is a constant of the type IP_XXX
70          */
71         uint8_t tcpip_proto;
72 };
73
74 /**
75  * A network-layer protocol of the TCP/IP stack (eg. IPV4, IPv6, etc)
76  */
77 struct tcpip_net_protocol {
78         /** Protocol name */
79         const char *name;
80         /** Network address family */
81         sa_family_t sa_family;
82         /**
83          * Transmit packet
84          *
85          * @v pkb               Packet buffer
86          * @v tcpip_protocol    Transport-layer protocol
87          * @v st_dest           Destination address
88          * @v netdev            Network device (or NULL to route automatically)
89          * @v trans_csum        Transport-layer checksum to complete, or NULL
90          * @ret rc              Return status code
91          *
92          * This function takes ownership of the packet buffer.
93          */
94         int ( * tx ) ( struct pk_buff *pkb,
95                        struct tcpip_protocol *tcpip_protocol,
96                        struct sockaddr_tcpip *st_dest,
97                        struct net_device *netdev,
98                        uint16_t *trans_csum );
99 };
100
101 /** Declare a TCP/IP transport-layer protocol */
102 #define __tcpip_protocol __table ( tcpip_protocols, 01 )
103
104 /** Declare a TCP/IP network-layer protocol */
105 #define __tcpip_net_protocol __table ( tcpip_net_protocols, 01 )
106
107 extern int tcpip_rx ( struct pk_buff *pkb, 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 pk_buff *pkb, 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 */