diff options
| author | Nikhil Chandru Rao | 2006-06-25 07:12:07 +0200 |
|---|---|---|
| committer | Nikhil Chandru Rao | 2006-06-25 07:12:07 +0200 |
| commit | fdc05e26646be08ae93d06ceab12b481f28949ac (patch) | |
| tree | 95bd374d7174bf4ff395acc1832142816f7d0b67 /src/include | |
| parent | Added gpxe-0.5/src/crypto/ for the SSL Library (diff) | |
| download | ipxe-fdc05e26646be08ae93d06ceab12b481f28949ac.tar.gz ipxe-fdc05e26646be08ae93d06ceab12b481f28949ac.tar.xz ipxe-fdc05e26646be08ae93d06ceab12b481f28949ac.zip | |
created interface for transport-network interface
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/gpxe/interface.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/src/include/gpxe/interface.h b/src/include/gpxe/interface.h new file mode 100644 index 000000000..d0f68b840 --- /dev/null +++ b/src/include/gpxe/interface.h @@ -0,0 +1,90 @@ +#ifndef _GPXE_INTERFACE_H +#define _GPXE_INTERFACE_H + +/** @file + * + * Transport-network layer interface + * + */ + +#include <stdint.h> +#include <gpxe/in.h> +#include <gpxe/tables.h> + +struct pk_buff; +struct net_protocol; +struct trans_protocol; +struct tcpip_net_protocol; + +/** + * A transport-layer protocol + */ +struct trans_protocol { + /** Protocol name */ + const char *name; + /** + * Process received packet + * + * @v pkb Packet buffer + * @v netdev Network device + * @v ll_source Link-layer source address + * + * This method takes ownership of the packet buffer. + */ + void ( * rx ) ( struct pk_buff *pkb, struct in_addr *src_net_addr, struct in_addr *dest_net_addr ); + /** + * Transport-layer protocol number + * + * This is a constant of the type IP_XXX + */ + uint8_t trans_proto; +}; + +/** + * A TCPIP supporting protocol + */ +struct tcpip_net_protocol { + /** Network protocol */ + struct net_protocol *net_protocol; + /** Network address family */ + sa_family_t sa_family; + /** Complete transport-layer checksum calculation + * + * @v pkb Packet buffer + * @v trans_proto Transport-layer protocol number + * + * This function expects a network-layer datagram in its packet with the protocol field in the + * IP header to be filled up. It constructs a psuedo-header using the information provided in + * the IP header and computes the checksum over the pseudo-header. The checksum offset in the + * transport layer header can be determined without the need of an offset value as + * + * void *csum_offset = pkb->data + NET_HLEN + csum_offset ( trans_proto ); + * + * where, + * csum_offset ( IP_TCP ) = 16 + * csum_offset ( IP_UDP ) = 6 + */ + void ( * tx_csum ) ( struct pk_buff *pkb ); +}; + +/** + * Register a transport-layer protocol + * + * @v protocol Transport-layer protocol + */ +#define TRANS_PROTOCOL( protocol ) \ + struct trans_protocol protocol __table ( trans_protocols, 01 ) + +#define TCPIP_NET_PROTOCOL( protocol ) \ + struct tcpip_net_protocol protocol __table ( tcpip_net_protocols, 01 ) + +extern void trans_rx ( struct pk_buff *pkb, uint8_t trans_proto, struct in_addr *src, struct in_addr *dest ); +extern int trans_tx ( struct pk_buff *pkb, uint8_t trans_proto, struct sockaddr *dest ); + +extern uint16_t calc_chksum ( void *data, size_t len ); + +/** Do we need these functions? -Nikhil, 24-6-06 */ +extern struct trans_protocol * find_trans_protocol ( uint8_t trans_proto ); +extern struct tcpip_net_protocol * find_tcpip_net_protocol ( sa_family_t sa_family ); + +#endif /* _GPXE_INTERFACE_H */ |
