Minor changes to the network layer rx() functions
[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/in.h>
12 #include <gpxe/tables.h>
13
14 struct pk_buff;
15 struct net_protocol;
16 struct tcpip_protocol;
17 struct tcpip_net_protocol;
18
19 /** 
20  * A transport-layer protocol of the TCPIP stack (eg. UDP, TCP, etc)
21  */
22 struct tcpip_protocol {
23         /** Protocol name */
24         const char *name;
25         /**
26          * Process received packet
27          *
28          * @v pkb       Packet buffer
29          * @v netdev    Network device
30          * @v ll_source Link-layer source address
31          *
32          * This method takes ownership of the packet buffer.
33          */
34         void ( * rx ) ( struct pk_buff *pkb, struct in_addr *src_net_addr,
35                         struct in_addr *dest_net_addr );
36
37         /** 
38          * Transport-layer protocol number
39          *
40          * This is a constant of the type IP_XXX
41          */
42         uint8_t trans_proto;
43         /**
44          * Checksum offset
45          *
46          * A negative number indicates that the protocol does not require
47          * checksumming to be performed by the network layer. A positive number
48          * is the offset of the checksum field in the transport-layer header.
49          */
50         int csum_offset;
51 };
52
53 /**
54  * A TCPIP supporting network-layer protocol
55  */
56 struct tcpip_net_protocol {
57         /** Network protocol */
58         struct net_protocol *net_protocol;
59         /** Network address family */
60         sa_family_t sa_family;
61         /**
62          * Transmit packet
63          *
64          * @v pkb               Packet buffer
65          * @v tcpip             Transport-layer TCP/IP protocol
66          * @v sock              Socket address
67          */
68         int ( * tx ) ( struct pk_buff *pkb, struct tcpip_protocol *tcpip,
69                         struct sockaddr *sock ); 
70         /** Complete transport-layer checksum calculation
71          *
72          * @v pkb               Packet buffer
73          * @v tcpip             Transport-layer protocol
74          *
75          */
76         void ( * tx_csum ) ( struct pk_buff *pkb,
77                              struct tcpip_protocol *tcpip );
78 };
79
80 /**
81  * Register a transport-layer protocol
82  *
83  * @v protocol          Transport-layer protocol
84  */
85 #define TCPIP_PROTOCOL( protocol ) \
86         struct tcpip_protocol protocol __table ( tcpip_protocols, 01 )
87
88 #define TCPIP_NET_PROTOCOL( protocol ) \
89         struct tcpip_net_protocol protocol __table ( tcpip_net_protocols, 01 )
90
91 extern void tcpip_rx ( struct pk_buff *pkb, uint8_t trans_proto, 
92                        struct in_addr *src, struct in_addr *dest );
93
94 extern int tcpip_tx ( struct pk_buff *pkb, struct tcpip_protocol *tcpip, 
95                       struct sockaddr *dest );
96
97 extern unsigned int tcpip_continue_chksum ( unsigned int partial,
98                                             const void *data, size_t len );
99 extern unsigned int tcpip_chksum ( const void *data, size_t len );
100
101 #endif /* _GPXE_TCPIP_H */