summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2008-11-21 21:31:12 +0100
committerMichael Brown2008-11-21 21:34:02 +0100
commit02a021587336a9ada3845025610ba836b173464d (patch)
tree972b32b60effd0ed54752581e93498d3eaa4aa59
parent[pxe] Select the correct network device on multiport cards (diff)
downloadipxe-02a021587336a9ada3845025610ba836b173464d.tar.gz
ipxe-02a021587336a9ada3845025610ba836b173464d.tar.xz
ipxe-02a021587336a9ada3845025610ba836b173464d.zip
[netdevice] Provide function to retrieve the most recently opened net device
There are currently four places within the codebase that use a heuristic to guess the "boot network device", with varying degrees of success. Add a feature to the net device core to maintain a list of open network devices, in order of opening, and provide a function last_opened_netdev() to retrieve the most recently opened net device. This should do a better job than the current assortment of guess_boot_netdev() functions.
-rw-r--r--src/include/gpxe/netdevice.h3
-rw-r--r--src/net/netdevice.c26
2 files changed, 29 insertions, 0 deletions
diff --git a/src/include/gpxe/netdevice.h b/src/include/gpxe/netdevice.h
index 01b853f3..f1585de0 100644
--- a/src/include/gpxe/netdevice.h
+++ b/src/include/gpxe/netdevice.h
@@ -229,6 +229,8 @@ struct net_device {
struct refcnt refcnt;
/** List of network devices */
struct list_head list;
+ /** List of open network devices */
+ struct list_head open_list;
/** Name of this network device */
char name[8];
/** Underlying hardware device */
@@ -424,6 +426,7 @@ extern void netdev_irq ( struct net_device *netdev, int enable );
extern struct net_device * find_netdev ( const char *name );
extern struct net_device * find_netdev_by_location ( unsigned int bus_type,
unsigned int location );
+extern struct net_device * last_opened_netdev ( void );
extern int net_tx ( struct io_buffer *iobuf, struct net_device *netdev,
struct net_protocol *net_protocol, const void *ll_dest );
extern int net_rx ( struct io_buffer *iobuf, struct net_device *netdev,
diff --git a/src/net/netdevice.c b/src/net/netdevice.c
index e8587a9d..9e142d27 100644
--- a/src/net/netdevice.c
+++ b/src/net/netdevice.c
@@ -45,6 +45,9 @@ static struct net_protocol net_protocols_end[0]
/** List of network devices */
struct list_head net_devices = LIST_HEAD_INIT ( net_devices );
+/** List of open network devices, in reverse order of opening */
+struct list_head open_net_devices = LIST_HEAD_INIT ( open_net_devices );
+
/**
* Record network device statistic
*
@@ -368,6 +371,10 @@ int netdev_open ( struct net_device *netdev ) {
/* Mark as opened */
netdev->state |= NETDEV_OPEN;
+
+ /* Add to head of open devices list */
+ list_add ( &netdev->open_list, &open_net_devices );
+
return 0;
}
@@ -393,6 +400,9 @@ void netdev_close ( struct net_device *netdev ) {
/* Mark as closed */
netdev->state &= ~NETDEV_OPEN;
+
+ /* Remove from open devices list */
+ list_del ( &netdev->open_list );
}
/**
@@ -463,6 +473,22 @@ struct net_device * find_netdev_by_location ( unsigned int bus_type,
}
/**
+ * Get most recently opened network device
+ *
+ * @ret netdev Most recently opened network device, or NULL
+ */
+struct net_device * last_opened_netdev ( void ) {
+ struct net_device *netdev;
+
+ list_for_each_entry ( netdev, &open_net_devices, open_list ) {
+ assert ( netdev->state & NETDEV_OPEN );
+ return netdev;
+ }
+
+ return NULL;
+}
+
+/**
* Transmit network-layer packet
*
* @v iobuf I/O buffer