aa2ccd5d0b1710577a9d8d68888ba680ce6170b4
[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, struct in_addr *dest_net_addr );
35         /** 
36          * Transport-layer protocol number
37          *
38          * This is a constant of the type IP_XXX
39          */
40         uint8_t trans_proto;
41         /**
42          * Checksum offset
43          *
44          * A negative number indicates that the protocol does not require
45          * checksumming to be performed by the network layer. A positive number is
46          * the offset of the checksum field in the transport-layer header.
47          */
48         int csum_offset;
49 };
50
51 /**
52  * A TCPIP supporting network-layer protocol
53  */
54 struct tcpip_net_protocol {
55         /** Network protocol */
56         struct net_protocol *net_protocol;
57         /** Network address family */
58         sa_family_t sa_family;
59         /** Complete transport-layer checksum calculation
60          *
61          * @v pkb               Packet buffer
62          * @v tcpip             Transport-layer protocol
63          *
64          */
65         void ( * tx_csum ) ( struct pk_buff *pkb,
66                              struct tcpip_protocol *tcpip );
67 };
68
69 /**
70  * Register a transport-layer protocol
71  *
72  * @v protocol          Transport-layer protocol
73  */
74 #define TCPIP_PROTOCOL( protocol ) \
75         struct tcpip_protocol protocol __table ( tcpip_protocols, 01 )
76
77 #define TCPIP_NET_PROTOCOL( protocol ) \
78         struct tcpip_net_protocol protocol __table ( tcpip_net_protocols, 01 )
79
80 extern void tcpip_rx ( struct pk_buff *pkb, uint8_t trans_proto, 
81                        struct in_addr *src, struct in_addr *dest );
82
83 extern int tcpip_tx ( struct pk_buff *pkb, struct tcpip_protocol *tcpip, 
84                       struct sockaddr *dest );
85
86 extern unsigned int tcpip_continue_chksum ( unsigned int partial,
87                                             const void *data, size_t len );
88 extern unsigned int tcpip_chksum ( const void *data, size_t len );
89
90 #endif /* _GPXE_TCPIP_H */