diff options
| author | Michael Brown | 2006-04-19 13:32:24 +0200 |
|---|---|---|
| committer | Michael Brown | 2006-04-19 13:32:24 +0200 |
| commit | bdc8190c8dea79b0d72f5b80654269836964e5b8 (patch) | |
| tree | 4f9e76186afde789b988fb1d9c14d39e2fc7f7ed /src/include | |
| parent | Updated to remove obsolete constants (diff) | |
| download | ipxe-bdc8190c8dea79b0d72f5b80654269836964e5b8.tar.gz ipxe-bdc8190c8dea79b0d72f5b80654269836964e5b8.tar.xz ipxe-bdc8190c8dea79b0d72f5b80654269836964e5b8.zip | |
Remove the concept of the media-independent link-layer header and replace
it with metadata in the pkb structure. This is required since UNDI will
want to be able to parse the link-layer header without destroying it.
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/gpxe/arp.h | 2 | ||||
| -rw-r--r-- | src/include/gpxe/llh.h | 63 | ||||
| -rw-r--r-- | src/include/gpxe/netdevice.h | 62 | ||||
| -rw-r--r-- | src/include/gpxe/pkbuff.h | 32 |
4 files changed, 59 insertions, 100 deletions
diff --git a/src/include/gpxe/arp.h b/src/include/gpxe/arp.h index 64e6c2723..f6ec47af7 100644 --- a/src/include/gpxe/arp.h +++ b/src/include/gpxe/arp.h @@ -12,7 +12,7 @@ struct net_interface; struct pk_buff; extern int arp_resolve ( struct net_device *netdev, struct pk_buff *pkb, - void *ll_addr ); + const void **ll_addr ); extern int arp_process ( struct net_interface *arp_netif, struct pk_buff *pkb ); diff --git a/src/include/gpxe/llh.h b/src/include/gpxe/llh.h deleted file mode 100644 index f60078149..000000000 --- a/src/include/gpxe/llh.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _LLH_H -#define _LLH_H - -/** @file - * - * Link-layer headers - * - * This file defines a media-independent link-layer header, used for - * communication between the network and link layers of the stack. - * - */ - -#include <stdint.h> - -/** Maximum length of a link-layer address */ -#define MAX_LLH_ADDR_LEN 6 - -/** Maximum length of a network-layer address */ -#define MAX_NET_ADDR_LEN 4 - -/* Network-layer address may be required to contain a raw link-layer address */ -#if MAX_NET_ADDR_LEN < MAX_LLH_ADDR_LEN -#undef MAX_NET_ADDR_LEN -#define MAX_NET_ADDR_LEN MAX_LLH_ADDR_LEN -#endif - -/** A media-independent link-layer header - * - * This structure represents a generic link-layer header. It never - * appears on the wire, but is used to communicate between different - * layers within the gPXE protocol stack. - */ -struct gpxehdr { - /** The network-layer protocol - * - * This is the network-layer protocol expressed as an - * ETH_P_XXX constant, in network-byte order. - */ - uint16_t net_proto; - /** Flags - * - * Filled in only on outgoing packets. Value is the - * bitwise-OR of zero or more GPXE_FL_XXX constants. - */ - uint8_t flags; - /** Network-layer address length - * - * Filled in only on outgoing packets. - */ - uint8_t net_addr_len; - /** Network-layer address - * - * Filled in only on outgoing packets. - */ - uint8_t net_addr[MAX_NET_ADDR_LEN]; -} __attribute__ (( packed )); - -/* Media-independent link-layer header flags */ -#define GPXE_FL_BROADCAST 0x01 -#define GPXE_FL_MULTICAST 0x02 -#define GPXE_FL_RAW 0x04 - -#endif /* _LLH_H */ diff --git a/src/include/gpxe/netdevice.h b/src/include/gpxe/netdevice.h index dbb6be84a..7517c3e71 100644 --- a/src/include/gpxe/netdevice.h +++ b/src/include/gpxe/netdevice.h @@ -8,13 +8,18 @@ */ #include <stdint.h> -#include <gpxe/llh.h> #include <gpxe/list.h> struct net_device; struct net_interface; struct pk_buff; +/** Maximum length of a link-layer address */ +#define MAX_LLH_ADDR_LEN 6 + +/** Maximum length of a network-layer address */ +#define MAX_NET_ADDR_LEN 4 + /** * A network device * @@ -45,7 +50,6 @@ struct net_device { /** Poll for received packet * * @v netdev Network device - * @v retrieve Flag indicating whether or not to retrieve packet * @v pkb Packet buffer to contain received packet * @ret rc Return status code * @@ -53,55 +57,42 @@ struct net_device { * received packet. If no packet is available, the method * should return -EAGAIN (i.e. this method is *always* * considered to be a non-blocking read). If a packet is - * available, but @c retrieve is false, the method should - * return zero for success. If a packet is available and @c - * retrieve is true, the method should fill the packet buffer - * and return zero for success. + * available, the method should fill the packet buffer and + * return zero for success. */ - int ( * poll ) ( struct net_device *netdev, int retrieve, - struct pk_buff *pkb ); - /** Build media-specific link-layer header + int ( * poll ) ( struct net_device *netdev, struct pk_buff *pkb ); + /** Build link-layer header * * @v netdev Network device * @v pkb Packet buffer * @ret rc Return status code * - * This method should convert the packet buffer's generic - * link-layer header (a struct gpxehdr) into a media-specific - * link-layer header (e.g. a struct ethhdr). The generic - * header should be removed from the buffer (via pkb_pull()) - * and the media-specific header should be prepended (via - * pkb_push()) in its place. + * This method should fill in the link-layer header based on + * the metadata contained in @c pkb. * * If a link-layer header cannot be constructed (e.g. because * of a missing ARP cache entry), then this method should * return an error (after transmitting an ARP request, if * applicable). */ - int ( * make_media_header ) ( struct net_device *netdev, - struct pk_buff *pkb ); - /** Build media-independent link-layer header + int ( * build_llh ) ( struct net_device *netdev, struct pk_buff *pkb ); + /** Parse link-layer header * * @v netdev Network device * @v pkb Packet buffer * @ret rc Return status code * - * This method should convert the packet buffer's - * media-specific link-layer header (e.g. a struct ethhdr) - * into a generic link-layer header (a struct gpxehdr). It - * performs the converse function of make_media_header(). - * - * Note that the gpxehdr::addr and gpxehdr::addrlen fields - * will not be filled in by this function, since doing so - * would require understanding the network-layer header. + * This method should parse the link-layer header and fill in + * the metadata in @c pkb. */ - int ( * make_generic_header ) ( struct net_device *netdev, - struct pk_buff *pkb ); + int ( * parse_llh ) ( struct net_device *netdev, struct pk_buff *pkb ); /** Link-layer protocol * * This is an ARPHRD_XXX constant, in network byte order. */ uint16_t ll_proto; + /** Link-layer header length */ + uint8_t ll_hlen; /** Link-layer address length */ uint8_t ll_addr_len; /** Link-layer address @@ -151,17 +142,18 @@ struct net_interface { */ int ( * process ) ( struct net_interface *netif, struct pk_buff *pkb ); - /** Add media-independent link-layer header + /** Fill in packet metadata * * @v netif Network interface * @v pkb Packet buffer * @ret rc Return status code * - * This method should prepend a generic link-layer header (a - * struct @c gpxehdr) to the packet buffer using pkb_push(). + * This method should fill in the @c pkb metadata with enough + * information to enable net_device::build_llh to construct + * the link-layer header. */ - int ( * add_generic_header ) ( struct net_interface *netif, - struct pk_buff *pkb ); + int ( * add_llh_metadata ) ( struct net_interface *netif, + struct pk_buff *pkb ); }; /** @@ -196,9 +188,7 @@ extern struct net_device static_single_netdev; extern int register_netdevice ( struct net_device *netdev ); -static inline void unregister_netdevice ( struct net_device *netdev __unused ){ - /* Do nothing */ -} +extern void unregister_netdevice ( struct net_device *netdev ); static inline void free_netdevice ( struct net_device *netdev __unused ) { /* Do nothing */ diff --git a/src/include/gpxe/pkbuff.h b/src/include/gpxe/pkbuff.h index bcc304977..f82f508ac 100644 --- a/src/include/gpxe/pkbuff.h +++ b/src/include/gpxe/pkbuff.h @@ -26,8 +26,40 @@ struct pk_buff { void *tail; /** End of the buffer */ void *end; + + /** The network-layer protocol + * + * This is the network-layer protocol expressed as an + * ETH_P_XXX constant, in network-byte order. + */ + uint16_t net_proto; + /** Flags + * + * Filled in only on outgoing packets. Value is the + * bitwise-OR of zero or more PKB_FL_XXX constants. + */ + uint8_t flags; + /** Network-layer address length + * + * Filled in only on outgoing packets. + */ + uint8_t net_addr_len; + /** Network-layer address + * + * Filled in only on outgoing packets. + */ + void *net_addr; }; +/** Packet is a broadcast packet */ +#define PKB_FL_BROADCAST 0x01 + +/** Packet is a multicast packet */ +#define PKB_FL_MULTICAST 0x02 + +/** Network-layer address is a raw hardware address */ +#define PKB_FL_RAW_NET_ADDR 0x04 + /** * Add data to start of packet buffer * |
