#include <linux/inetdevice.h>
static int my_inetaddr_event(struct notifier_block *nb,
unsigned long event, void *ptr)
{
struct in_ifaddr *ifa = ptr;
struct net_device *dev = ifa->ifa_dev->dev;
__be32 addr = ifa->ifa_address;
switch (event) {
case NETDEV_UP: /* カーネルバージョンによっては使われ方が違うことも */
case NETDEV_CHANGEADDR:
case NETDEV_CHANGEINFODATA:
default:
break;
}
/* 典型的には、以下のようなイベントを拾う */
switch (event) {
case NETDEV_UP: /* 場合によっては ADDR_ADD */
pr_info("myhook: IPv4 addr added on %s: %pI4\n",
dev->name, &addr);
break;
case NETDEV_DOWN: /* 場合によっては ADDR_DEL */
pr_info("myhook: IPv4 addr removed on %s: %pI4\n",
dev->name, &addr);
break;
}
return NOTIFY_DONE;
}
static struct notifier_block my_inet_nb = {
.notifier_call = my_inetaddr_event,
};
static int __init mymod_init(void)
{
int ret;
ret = register_inetaddr_notifier(&my_inet_nb);
if (ret) {
pr_err("myhook: register_inetaddr_notifier failed: %d\n", ret);
return ret;
}
/* さっきの netdevice_notifier も併用可能 */
// register_netdevice_notifier(&my_nb);
return 0;
}
static void __exit mymod_exit(void)
{
unregister_inetaddr_notifier(&my_inet_nb);
// unregister_netdevice_notifier(&my_nb);
}
module_init(mymod_init);
module_exit(mymod_exit);
MODULE_LICENSE("GPL");