summaryrefslogtreecommitdiffstats
path: root/src/net/netdevice.c
diff options
context:
space:
mode:
authorMichael Brown2013-10-31 15:09:43 +0100
committerMichael Brown2013-11-01 03:26:44 +0100
commit5c11ff630440b5ef6d1bfadab06e265f61312369 (patch)
treef0014ce8335637cd92f997c4bb301f9da723edb6 /src/net/netdevice.c
parent[parseopt] Add parse_timeout() (diff)
downloadipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.tar.gz
ipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.tar.xz
ipxe-5c11ff630440b5ef6d1bfadab06e265f61312369.zip
[netdevice] Make all net_driver methods optional
Most network upper-layer drivers do not implement all three methods (probe, notify, and remove). Save code by making all methods optional. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/netdevice.c')
-rw-r--r--src/net/netdevice.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/net/netdevice.c b/src/net/netdevice.c
index c7c86c1a..fcd1f7cf 100644
--- a/src/net/netdevice.c
+++ b/src/net/netdevice.c
@@ -90,8 +90,10 @@ static int netdev_has_ll_addr ( struct net_device *netdev ) {
static void netdev_notify ( struct net_device *netdev ) {
struct net_driver *driver;
- for_each_table_entry ( driver, NET_DRIVERS )
- driver->notify ( netdev );
+ for_each_table_entry ( driver, NET_DRIVERS ) {
+ if ( driver->notify )
+ driver->notify ( netdev );
+ }
}
/**
@@ -535,7 +537,7 @@ int register_netdev ( struct net_device *netdev ) {
/* Probe device */
for_each_table_entry ( driver, NET_DRIVERS ) {
- if ( ( rc = driver->probe ( netdev ) ) != 0 ) {
+ if ( driver->probe && ( rc = driver->probe ( netdev ) ) != 0 ) {
DBGC ( netdev, "NETDEV %s could not add %s device: "
"%s\n", netdev->name, driver->name,
strerror ( rc ) );
@@ -546,8 +548,10 @@ int register_netdev ( struct net_device *netdev ) {
return 0;
err_probe:
- for_each_table_entry_continue_reverse ( driver, NET_DRIVERS )
- driver->remove ( netdev );
+ for_each_table_entry_continue_reverse ( driver, NET_DRIVERS ) {
+ if ( driver->remove )
+ driver->remove ( netdev );
+ }
clear_settings ( netdev_settings ( netdev ) );
unregister_settings ( netdev_settings ( netdev ) );
err_register_settings:
@@ -629,8 +633,10 @@ void unregister_netdev ( struct net_device *netdev ) {
netdev_close ( netdev );
/* Remove device */
- for_each_table_entry_reverse ( driver, NET_DRIVERS )
- driver->remove ( netdev );
+ for_each_table_entry_reverse ( driver, NET_DRIVERS ) {
+ if ( driver->remove )
+ driver->remove ( netdev );
+ }
/* Unregister per-netdev configuration settings */
clear_settings ( netdev_settings ( netdev ) );