return 0;
}
-/**
- * Handle network device link state change
- *
- * @v netdev Network device
- */
-static void cachedhcp_notify ( struct net_device *netdev __unused ) {
-
- /* Nothing to do */
-}
-
-/**
- * Handle network device removal
- *
- * @v netdev Network device
- */
-static void cachedhcp_remove ( struct net_device *netdev __unused ) {
-
- /* Nothing to do */
-}
-
/** Cached DHCP packet network device driver */
struct net_driver cachedhcp_driver __net_driver = {
.name = "cachedhcp",
.probe = cachedhcp_probe,
- .notify = cachedhcp_notify,
- .remove = cachedhcp_remove,
};
return rc;
}
-/**
- * Handle network device or link state change
- *
- * @v netdev Network device
- */
-static void guestinfo_net_notify ( struct net_device *netdev __unused ) {
- /* Nothing to do */
-}
-
/**
* Remove per-netdevice GuestInfo settings
*
struct net_driver guestinfo_net_driver __net_driver = {
.name = "GuestInfo",
.probe = guestinfo_net_probe,
- .notify = guestinfo_net_notify,
.remove = guestinfo_net_remove,
};
return 0;
}
-/**
- * Handle IPv6 network device or link state change
- *
- * @v netdev Network device
- */
-static void ipv6_notify ( struct net_device *netdev __unused ) {
-
- /* Nothing to do */
-}
-
/**
* Destroy IPv6 network device
*
struct net_driver ipv6_driver __net_driver = {
.name = "IPv6",
.probe = ipv6_probe,
- .notify = ipv6_notify,
.remove = ipv6_remove,
};
return 0;
}
-/**
- * Update neighbour cache on network device creation
- *
- * @v netdev Network device
- */
-static int neighbour_probe ( struct net_device *netdev __unused ) {
- /* Nothing to do */
- return 0;
-}
-
/**
* Update neighbour cache on network device state change or removal
*
/** Neighbour driver (for net device notifications) */
struct net_driver neighbour_net_driver __net_driver = {
.name = "Neighbour",
- .probe = neighbour_probe,
.notify = neighbour_flush,
.remove = neighbour_flush,
};
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 );
+ }
}
/**
/* 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 ) );
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:
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 ) );
return 0;
}
-/**
- * Do nothing
- *
- * @v trunk Trunk network device
- * @ret rc Return status code
- */
-static int vlan_probe ( struct net_device *trunk __unused ) {
- return 0;
-}
-
/**
* Handle trunk network device link state change
*
/** VLAN driver */
struct net_driver vlan_driver __net_driver = {
.name = "VLAN",
- .probe = vlan_probe,
.notify = vlan_notify,
.remove = vlan_remove,
};