以下程序可以证明这一点:
#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kernel_stat.h>
#include <linux/platform_device.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <net/neighbour.h>
#include <net/arp.h>
#include <linux/if_arp.h>
#include <net/ip.h>
#include <net/netevent.h>
/**
* sudo arp-scan -I eth0 --localnet
*/
int callback(struct notifier_block *nb, unsigned long msg, void *ptr) {
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
pr_err("netdevice_notifier allback,msg = %ld \n", msg);
pr_err("netdev->name= %s \n", netdev->name);
if (strcmp(netdev->name, "eth0") == 0 && msg == NETDEV_UP) {
netdev_state_change(netdev);
pr_err("-------------\n");
return 0;
}
switch (msg) {
case NETDEV_CHANGENAME:
pr_err("NETDEV_CHANGENAME\n");
break;
case NETDEV_UP:
pr_err("NETDEV_UP\n");
break;
case NETDEV_DOWN:
pr_err("NETDEV_DOWN\n");
break;
case NETDEV_REGISTER:
pr_err("NETDEV_REGISTER\n");
break;
case NETDEV_CHANGE:
pr_err("NETDEV_CHANGE\n");
break;
default:
break;
}
pr_err("-------------\n");
return 0;
}
int myprobe(struct platform_device *pdev) {
struct notifier_block nb;
nb.notifier_call = callback;
register_netdevice_notifier(&nb);
return 0;
}
int myremove(struct platform_device *pdev) {
pr_info("myplatformdriver myremove \n");
return 0;
}
struct of_device_id my_of_match_table =
{ .compatible = "my_platform_device_003", };
struct platform_driver my_platform_driver = { .driver = { .of_match_table =
&my_of_match_table, .name = "my-platform-driver", .owner =
THIS_MODULE, }, .probe = myprobe, .remove = myremove, };
module_platform_driver(my_platform_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Andy");
MODULE_DESCRIPTION("andy one-key driver");
MODULE_ALIAS("one-key");