mirror of
https://github.com/xcat2/xNBA.git
synced 2025-04-11 02:05:11 +00:00
[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.
This commit is contained in:
parent
8e8a348fd4
commit
02a0215873
@ -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,
|
||||
|
@ -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 );
|
||||
}
|
||||
|
||||
/**
|
||||
@ -462,6 +472,22 @@ struct net_device * find_netdev_by_location ( unsigned int bus_type,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user