summaryrefslogtreecommitdiffstats
path: root/src/include/gpxe
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/gpxe')
-rw-r--r--src/include/gpxe/arp.h24
-rw-r--r--src/include/gpxe/ethernet.h15
-rw-r--r--src/include/gpxe/ip.h4
-rw-r--r--src/include/gpxe/netdevice.h202
-rw-r--r--src/include/gpxe/pkbuff.h14
5 files changed, 78 insertions, 181 deletions
diff --git a/src/include/gpxe/arp.h b/src/include/gpxe/arp.h
index a1f9e349c..ffaf418a1 100644
--- a/src/include/gpxe/arp.h
+++ b/src/include/gpxe/arp.h
@@ -7,9 +7,33 @@
*
*/
+#include <gpxe/tables.h>
+
struct net_device;
struct net_protocol;
+/** A network-layer protocol that relies upon ARP */
+struct arp_net_protocol {
+ /** Network-layer protocol */
+ struct net_protocol *net_protocol;
+ /** Check existence of address
+ *
+ * @v netdev Network device
+ * @v net_addr Network-layer address
+ * @ret rc Return status code
+ */
+ int ( * check ) ( struct net_device *netdev,
+ const void *net_addr );
+};
+
+/**
+ * Register an ARP protocol
+ *
+ * @v protocol ARP protocol
+ */
+#define ARP_NET_PROTOCOL( protocol ) \
+ struct arp_net_protocol protocol __table ( arp_net_protocols, 01 )
+
extern int arp_resolve ( struct net_device *netdev,
struct net_protocol *net_protocol,
const void *dest_net_addr,
diff --git a/src/include/gpxe/ethernet.h b/src/include/gpxe/ethernet.h
index e62eb09b5..0188ac81c 100644
--- a/src/include/gpxe/ethernet.h
+++ b/src/include/gpxe/ethernet.h
@@ -18,11 +18,14 @@ extern struct ll_protocol ethernet_protocol;
* @v priv_size Size of driver private data
* @ret netdev Network device, or NULL
*/
-#define alloc_etherdev( priv_size ) ( { \
- struct net_device *netdev; \
- netdev = alloc_netdev ( priv_size ); \
- if ( netdev ) \
- netdev->ll_protocol = &ethernet_protocol; \
- netdev; } )
+static inline struct net_device * alloc_etherdev ( size_t priv_size ) {
+ struct net_device *netdev;
+
+ netdev = alloc_netdev ( priv_size );
+ if ( netdev ) {
+ netdev->ll_protocol = &ethernet_protocol;
+ }
+ return netdev;
+}
#endif /* _GPXE_ETHERNET_H */
diff --git a/src/include/gpxe/ip.h b/src/include/gpxe/ip.h
index 8eac31a62..7cd2fcff9 100644
--- a/src/include/gpxe/ip.h
+++ b/src/include/gpxe/ip.h
@@ -7,6 +7,8 @@
*
*/
+#include <ip.h>
+
struct net_protocol;
extern struct net_protocol ipv4_protocol;
@@ -15,6 +17,6 @@ extern int add_ipv4_address ( struct net_device *netdev,
struct in_addr address, struct in_addr netmask,
struct in_addr gateway );
extern void del_ipv4_address ( struct net_device *netdev );
-extern int ipv4_uip_transmit ( struct pk_buff *pkb );
+extern int ipv4_uip_tx ( struct pk_buff *pkb );
#endif /* _GPXE_IP_H */
diff --git a/src/include/gpxe/netdevice.h b/src/include/gpxe/netdevice.h
index 68226dc25..b8cf9aeec 100644
--- a/src/include/gpxe/netdevice.h
+++ b/src/include/gpxe/netdevice.h
@@ -8,6 +8,7 @@
*/
#include <stdint.h>
+#include <gpxe/list.h>
#include <gpxe/tables.h>
struct pk_buff;
@@ -24,61 +25,6 @@ struct ll_protocol;
/** Maximum length of a network-layer address */
#define MAX_NET_ADDR_LEN 4
-/* Network-layer address may be required to hold a link-layer address
- * (if NETADDR_FL_RAW is set
- */
-#if MAX_NET_ADDR_LEN < MAX_LL_ADDR_LEN
-#undef MAX_NET_ADDR_LEN
-#define MAX_NET_ADDR_LEN MAX_LL_ADDR_LEN
-#endif
-
-/** A generic network-layer header */
-struct net_header {
- /** Network-layer protocol */
- struct net_protocol *net_protocol;
- /** Flags
- *
- * This is the bitwise OR of zero or more PKT_FL_XXX
- * values.
- */
- int flags;
- /** Network-layer destination address */
- uint8_t dest_net_addr[MAX_NET_ADDR_LEN];
- /** Network-layer source address */
- uint8_t source_net_addr[MAX_NET_ADDR_LEN];
-};
-
-/** Packet is a broadcast packet */
-#define PKT_FL_BROADCAST 0x01
-
-/** Packet is a multicast packet */
-#define PKT_FL_MULTICAST 0x02
-
-/** Addresses are raw hardware addresses */
-#define PKT_FL_RAW_ADDR 0x04
-
-/** A generic link-layer header */
-struct ll_header {
- /** Link-layer protocol */
- struct ll_protocol *ll_protocol;
- /** Flags
- *
- * This is the bitwise OR of zero or more PKT_FL_XXX
- * values.
- */
- int flags;
- /** Link-layer destination address */
- uint8_t dest_ll_addr[MAX_LL_ADDR_LEN];
- /** Link-layer source address */
- uint8_t source_ll_addr[MAX_LL_ADDR_LEN];
- /** Network-layer protocol
- *
- *
- * This is an ETH_P_XXX constant, in network-byte order
- */
- uint16_t net_proto;
-};
-
/**
* A network-layer protocol
*
@@ -90,11 +36,13 @@ struct net_protocol {
* Process received packet
*
* @v pkb Packet buffer
- * @ret rc Return status code
+ * @v netdev Network device
+ * @v ll_source Link-layer source address
*
* This method takes ownership of the packet buffer.
*/
- int ( * rx_process ) ( struct pk_buff *pkb );
+ int ( * rx ) ( struct pk_buff *pkb, struct net_device *netdev,
+ const void *ll_source );
/**
* Transcribe network-layer address
*
@@ -127,7 +75,6 @@ struct ll_protocol {
/**
* Transmit network-layer packet via network device
*
- *
* @v pkb Packet buffer
* @v netdev Network device
* @v net_protocol Network-layer protocol
@@ -137,22 +84,20 @@ struct ll_protocol {
* This method should prepend in the link-layer header
* (e.g. the Ethernet DIX header) and transmit the packet.
*/
- int ( * transmit ) ( struct pk_buff *pkb, struct net_device *netdev,
- struct net_protocol *net_protocol,
- const void *ll_dest );
+ int ( * tx ) ( struct pk_buff *pkb, struct net_device *netdev,
+ struct net_protocol *net_protocol,
+ const void *ll_dest );
/**
- * Parse media-specific link-layer header
+ * Handle received packet
*
* @v pkb Packet buffer
- * @v llhdr Generic link-layer header
+ * @v netdev Network device
*
- * This method should fill in the generic link-layer header
- * based on information in the link-layer header in the packet
- * buffer.
+ * This method should strip off the link-layer header
+ * (e.g. the Ethernet DIX header) and pass the packet to
+ * net_rx().
*/
- void ( * parse_llh ) ( const struct pk_buff *pkb,
- struct ll_header *llhdr );
-
+ void ( * rx ) ( struct pk_buff *pkb, struct net_device *netdev );
/**
* Transcribe link-layer address
*
@@ -165,7 +110,7 @@ struct ll_protocol {
* The buffer used to hold the transcription is statically
* allocated.
*/
- const char * ( *ntoa ) ( const void * ll_addr );
+ const char * ( * ntoa ) ( const void * ll_addr );
/** Link-layer protocol
*
* This is an ARPHRD_XXX constant, in network byte order.
@@ -178,17 +123,6 @@ struct ll_protocol {
};
/**
- * A network-layer address assigned to a network device
- *
- */
-struct net_address {
- /** Network-layer protocol */
- struct net_protocol *net_protocol;
- /** Network-layer address */
- uint8_t net_addr[MAX_NET_ADDR_LEN];
-};
-
-/**
* A network device
*
* This structure represents a piece of networking hardware. It has
@@ -199,6 +133,8 @@ struct net_address {
* not just an Ethernet device.
*/
struct net_device {
+ /** List of network devices */
+ struct list_head list;
/** Transmit packet
*
* @v netdev Network device
@@ -231,79 +167,13 @@ struct net_device {
*/
uint8_t ll_addr[MAX_LL_ADDR_LEN];
+ /** Received packet queue */
+ struct list_head rx_queue;
+
/** Driver private data */
void *priv;
};
-extern struct net_device static_single_netdev;
-
-/**
- * Allocate network device
- *
- * @v priv_size Size of private data area (net_device::priv)
- * @ret netdev Network device, or NULL
- *
- * Allocates space for a network device and its private data area.
- *
- * This macro allows for a very efficient implementation in the case
- * of a single static network device; it neatly avoids dynamic
- * allocation and can never return failure, meaning that the failure
- * path will be optimised away. However, driver writers should not
- * rely on this feature; the drivers should be written to allow for
- * multiple instances of network devices.
- */
-#define alloc_netdev( priv_size ) ( { \
- static char priv_data[priv_size]; \
- static_single_netdev.priv = priv_data; \
- &static_single_netdev; } )
-
-/**
- * Free network device
- *
- * @v netdev Network device
- */
-static inline void
-free_netdev ( struct net_device *netdev __attribute__ (( unused )) ) {
- /* Nothing to do */
-}
-
-/**
- * Transmit raw packet via network device
- *
- * @v netdev Network device
- * @v pkb Packet buffer
- * @ret rc Return status code
- *
- * Transmits the packet via the specified network device. The
- * link-layer header must already have been filled in. This function
- * takes ownership of the packet buffer.
- */
-static inline int netdev_transmit ( struct net_device *netdev,
- struct pk_buff *pkb ) {
- return netdev->transmit ( netdev, pkb );
-}
-
-/**
- * Transmit network-layer packet
- *
- * @v pkb Packet buffer
- * @v netdev Network device
- * @v net_protocol Network-layer protocol
- * @v ll_dest Destination link-layer address
- * @ret rc Return status code
- *
- * Prepends link-layer headers to the packet buffer and transmits the
- * packet via the specified network device. This function takes
- * ownership of the packet buffer.
- */
-static inline int net_transmit ( struct pk_buff *pkb,
- struct net_device *netdev,
- struct net_protocol *net_protocol,
- const void *ll_dest ) {
- return netdev->ll_protocol->transmit ( pkb, netdev, net_protocol,
- ll_dest );
-}
-
/**
* Register a link-layer protocol
*
@@ -321,23 +191,29 @@ static inline int net_transmit ( struct pk_buff *pkb,
struct net_protocol protocol __table ( net_protocols, 01 )
/**
- * Register a network-layer address for the static single network device
+ * Get network device name
+ *
+ * @v netdev Network device
+ * @ret name Network device name
*
- * @v net_address Network-layer address
+ * The name will be the device's link-layer address.
*/
-#define STATIC_SINGLE_NETDEV_ADDRESS( address ) \
- struct net_address address __table ( sgl_netdev_addresses, 01 )
+static inline const char * netdev_name ( struct net_device *netdev ) {
+ return netdev->ll_protocol->ntoa ( netdev->ll_addr );
+}
+extern int netdev_tx ( struct net_device *netdev, struct pk_buff *pkb );
+extern void netdev_rx ( struct net_device *netdev, struct pk_buff *pkb );
+extern int net_tx ( struct pk_buff *pkb, struct net_device *netdev,
+ struct net_protocol *net_protocol, const void *ll_dest );
+extern void net_rx ( struct pk_buff *pkb, struct net_device *netdev,
+ uint16_t net_proto, const void *ll_source );
+extern int netdev_poll ( struct net_device *netdev );
+extern struct pk_buff * netdev_rx_dequeue ( struct net_device *netdev );
+extern struct net_device * alloc_netdev ( size_t priv_size );
extern int register_netdev ( struct net_device *netdev );
extern void unregister_netdev ( struct net_device *netdev );
-extern void netdev_rx ( struct net_device *netdev, struct pk_buff *pkb );
-
-extern struct net_protocol *find_net_protocol ( uint16_t net_proto );
-extern struct net_device *
-find_netdev_by_net_addr ( struct net_protocol *net_protocol, void *net_addr );
-
-extern int net_poll ( void );
-extern struct pk_buff * net_rx_dequeue ( void );
-extern int net_rx_process ( struct pk_buff *pkb );
+extern void free_netdev ( struct net_device *netdev );
+extern struct net_device * next_netdev ( void );
#endif /* _GPXE_NETDEVICE_H */
diff --git a/src/include/gpxe/pkbuff.h b/src/include/gpxe/pkbuff.h
index 6c504029f..c363a50dc 100644
--- a/src/include/gpxe/pkbuff.h
+++ b/src/include/gpxe/pkbuff.h
@@ -14,9 +14,6 @@
#include <assert.h>
#include <gpxe/list.h>
-struct net_protocol;
-struct ll_protocol;
-
/**
* Packet buffer alignment
*
@@ -42,6 +39,9 @@ struct ll_protocol;
* This structure is used to represent a network packet within gPXE.
*/
struct pk_buff {
+ /** List of which this buffer is a member */
+ struct list_head list;
+
/** Start of the buffer */
void *head;
/** Start of data */
@@ -50,14 +50,6 @@ struct pk_buff {
void *tail;
/** End of the buffer */
void *end;
-
- /** List of which this buffer is a member */
- struct list_head list;
-
- /** The network-layer protocol */
- struct net_protocol *net_protocol;
- /** The link-layer protocol */
- struct ll_protocol *ll_protocol;
};
/**