#include <linux/module.h>
#include <linux/netdevice.h>
static int my_netdev_event(struct notifier_block *nb,
unsigned long event, void *ptr)
{
struct net_device *dev = netdev_notifier_info_to_dev(ptr);
switch (event) {
case NETDEV_REGISTER:
pr_info("netdev: %s registered\n", dev->name);
break;
case NETDEV_UNREGISTER:
pr_info("netdev: %s unregistered\n", dev->name);
break;
case NETDEV_UP:
pr_info("netdev: %s is UP\n", dev->name);
break;
case NETDEV_DOWN:
pr_info("netdev: %s is DOWN\n", dev->name);
break;
case NETDEV_CHANGE:
pr_info("netdev: %s state changed\n", dev->name);
break;
default:
break;
}
return NOTIFY_DONE;
}
static struct notifier_block my_nb = {
.notifier_call = my_netdev_event,
};
static int __init mymod_init(void)
{
int ret;
ret = register_netdevice_notifier(&my_nb);
if (ret)
pr_err("netdev: register_netdevice_notifier failed: %d\n", ret);
else
pr_info("netdev: loaded\n");
return ret;
}
static void __exit mymod_exit(void)
{
unregister_netdevice_notifier(&my_nb);
pr_info("netdev: unloaded\n");
}
module_init(mymod_init);
module_exit(mymod_exit);
MODULE_LICENSE("GPL");