Newer
Older
ASS_NetModule / IPAddr / ipaddr.c
@Motoki Motoki 2 days ago 1 KB loaded/unloaded message
#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;
    } else {
	pr_info("ipaddr mymodule loaded.\n");
    }

    return 0;
}

static void __exit mymod_exit(void)
{
    unregister_inetaddr_notifier(&my_inet_nb);
    pr_info("ipaddr mymodule removed.\n");
}

module_init(mymod_init);
module_exit(mymod_exit);

MODULE_LICENSE("GPL");