Remove _PROTOCOL macros for gcc 3.2 compatibility
[people/xl0/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
17 #define SA_TCPIP_LEN 32
18
19 /**
20  * TCP/IP socket address
21  *
22  * This contains the fields common to socket addresses for all TCP/IP
23  * address families.
24  */
25 struct sockaddr_tcpip {
26         /** Socket address family (part of struct @c sockaddr) */
27         sa_family_t st_family;
28         /** TCP/IP port */
29         uint16_t st_port;
30         /** Padding
31          *
32          * This ensures that a struct @c sockaddr_tcpip is large
33          * enough to hold a socket address for any TCP/IP address
34          * family.
35          */
36         char pad[SA_TCPIP_LEN - sizeof ( sa_family_t ) - sizeof ( uint16_t )];
37 };
38
39 /** 
40  * A transport-layer protocol of the TCP/IP stack (eg. UDP, TCP, etc)
41  */
42 struct tcpip_protocol {
43         /** Protocol name */
44         const char *name;
45         /**
46          * Process received packet
47          *
48          * @v pkb       Packet buffer
49          * @v st_src    Partially-filled source address
50          * @v st_dest   Partially-filled destination address
51          * @ret rc      Return status code
52          *
53          * This method takes ownership of the packet buffer.
54          */
55         int ( * rx ) ( struct pk_buff *pkb, struct sockaddr_tcpip *st_src,
56                        struct sockaddr_tcpip *st_dest );
57         /** 
58          * Transport-layer protocol number
59          *
60          * This is a constant of the type IP_XXX
61          */
62         uint8_t tcpip_proto;
63         /**
64          * Checksum offset
65          *
66          * A negative number indicates that the protocol does not
67          * require checksumming to be performed by the network layer.
68          * A positive number is the offset of the checksum field in
69          * the transport-layer header.
70          */
71         int csum_offset;
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          * @ret rc              Return status code
89          *
90          * This function takes ownership of the packet buffer.
91          */
92         int ( * tx ) ( struct pk_buff *pkb,
93                        struct tcpip_protocol *tcpip_protocol,
94                        struct sockaddr_tcpip *st_dest );
95 };
96
97 /** Declare a TCP/IP transport-layer protocol */
98 #define __tcpip_protocol __table ( tcpip_protocols, 01 )
99
100 /** Declare a TCP/IP network-layer protocol */
101 #define __tcpip_net_protocol __table ( tcpip_net_protocols, 01 )
102
103 extern int tcpip_rx ( struct pk_buff *pkb, uint8_t tcpip_proto,
104                       struct sockaddr_tcpip *st_src,
105                       struct sockaddr_tcpip *st_dest );
106 extern int tcpip_tx ( struct pk_buff *pkb, struct tcpip_protocol *tcpip, 
107                       struct sockaddr_tcpip *st_dest );
108 extern unsigned int tcpip_continue_chksum ( unsigned int partial,
109                                             const void *data, size_t len );
110 extern unsigned int tcpip_chksum ( const void *data, size_t len );
111
112 #endif /* _GPXE_TCPIP_H */