diff --git a/IPAddr/Makefile b/IPAddr/Makefile new file mode 100644 index 0000000..16c105a --- /dev/null +++ b/IPAddr/Makefile @@ -0,0 +1,8 @@ +obj-m := ipaddr.o +KDIR := /lib/modules/$(shell uname -r)/build +VERBOSE = 0 + +all: + $(MAKE) -C $(KDIR) M=$(PWD) KBUILD_VERBOSE=$(VERBOSE) CONFIG_DEBUG_INFO=y modules +clean: + rm -f *.o *.ko *.mod.c Module.symvers modules.order diff --git a/IPAddr/ipaddr.c b/IPAddr/ipaddr.c new file mode 100644 index 0000000..9723c93 --- /dev/null +++ b/IPAddr/ipaddr.c @@ -0,0 +1,59 @@ +#include + +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_LICENSE("GPL"); diff --git a/Netdevice/Makefile b/Netdevice/Makefile new file mode 100644 index 0000000..b2bcafc --- /dev/null +++ b/Netdevice/Makefile @@ -0,0 +1,8 @@ +obj-m := netdev.o +KDIR := /lib/modules/$(shell uname -r)/build +VERBOSE = 0 + +all: + $(MAKE) -C $(KDIR) M=$(PWD) KBUILD_VERBOSE=$(VERBOSE) CONFIG_DEBUG_INFO=y modules +clean: + rm -f *.o *.ko *.mod.c Module.symvers modules.order diff --git a/Netdevice/netdev.c b/Netdevice/netdev.c new file mode 100644 index 0000000..45cc9db --- /dev/null +++ b/Netdevice/netdev.c @@ -0,0 +1,59 @@ +#include +#include + +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("myhook: %s registered\n", dev->name); + break; + case NETDEV_UNREGISTER: + pr_info("myhook: %s unregistered\n", dev->name); + break; + case NETDEV_UP: + pr_info("myhook: %s is UP\n", dev->name); + break; + case NETDEV_DOWN: + pr_info("myhook: %s is DOWN\n", dev->name); + break; + case NETDEV_CHANGE: + pr_info("myhook: %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("myhook: register_netdevice_notifier failed: %d\n", ret); + else + pr_info("myhook: loaded\n"); + + return ret; +} + +static void __exit mymod_exit(void) +{ + unregister_netdevice_notifier(&my_nb); + pr_info("myhook: unloaded\n"); +} + +module_init(mymod_init); +module_exit(mymod_exit); + +MODULE_LICENSE("GPL"); +