d0f68b840582d06e17575d1dcbf27886d6d7f371
[people/xl0/gpxe.git] / src / include / gpxe / interface.h
1 #ifndef _GPXE_INTERFACE_H
2 #define _GPXE_INTERFACE_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 trans_protocol;
17 struct tcpip_net_protocol;
18
19 /** 
20  * A transport-layer protocol
21  */
22 struct trans_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
43 /**
44  * A TCPIP supporting protocol
45  */
46 struct tcpip_net_protocol {
47         /** Network protocol */
48         struct net_protocol *net_protocol;
49         /** Network address family */
50         sa_family_t sa_family;
51         /** Complete transport-layer checksum calculation
52          *
53          * @v pkb               Packet buffer
54          * @v trans_proto       Transport-layer protocol number
55          *
56          * This function expects a network-layer datagram in its packet with the protocol field in the
57          * IP header to be filled up. It constructs a psuedo-header using the information provided in
58          * the IP header and computes the checksum over the pseudo-header. The checksum offset in the
59          * transport layer header can be determined without the need of an offset value as
60          * 
61          * void *csum_offset = pkb->data + NET_HLEN + csum_offset ( trans_proto );
62          * 
63          * where,
64          * csum_offset ( IP_TCP ) = 16
65          * csum_offset ( IP_UDP ) = 6
66          */
67         void ( * tx_csum ) ( struct pk_buff *pkb );
68 };
69
70 /**
71  * Register a transport-layer protocol
72  *
73  * @v protocol          Transport-layer protocol
74  */
75 #define TRANS_PROTOCOL( protocol ) \
76         struct trans_protocol protocol __table ( trans_protocols, 01 )
77
78 #define TCPIP_NET_PROTOCOL( protocol ) \
79         struct tcpip_net_protocol protocol __table ( tcpip_net_protocols, 01 )
80
81 extern void trans_rx ( struct pk_buff *pkb, uint8_t trans_proto, struct in_addr *src, struct in_addr *dest );
82 extern int trans_tx ( struct pk_buff *pkb, uint8_t trans_proto, struct sockaddr *dest );
83
84 extern uint16_t calc_chksum ( void *data, size_t len );
85
86 /** Do we need these functions? -Nikhil, 24-6-06 */
87 extern struct trans_protocol * find_trans_protocol ( uint8_t trans_proto );
88 extern struct tcpip_net_protocol * find_tcpip_net_protocol ( sa_family_t sa_family );
89
90 #endif /* _GPXE_INTERFACE_H */