| Submitter | stephen hemminger |
|---|---|
| Date | Nov. 21, 2008, 9:46 p.m. |
| Message ID | <20081121134659.5b305b5c@extreme> |
| Download | mbox | patch |
| Permalink | /patch/10134/ |
| State | RFC |
| Delegated to: | David Miller |
| Headers | show |
Comments
From: Stephen Hemminger <shemminger@vyatta.com> Date: Fri, 21 Nov 2008 13:46:59 -0800 > Perhaps the following would make it easier for applications to > track network device events without having to use netlink. > Compile tested only so far. The implementation is almost trivial... I'm fine with this, what do others think? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Nov 21, 2008 at 5:24 PM, David Miller <davem@davemloft.net> wrote: > From: Stephen Hemminger <shemminger@vyatta.com> > Date: Fri, 21 Nov 2008 13:46:59 -0800 > >> Perhaps the following would make it easier for applications to >> track network device events without having to use netlink. >> Compile tested only so far. The implementation is almost trivial... > > I'm fine with this, what do others think? > -- Looks fine to me, thanks to Stephen for taking my suggestion and running with it.
Patch
--- a/net/core/Makefile 2008-11-21 12:25:31.000000000 -0800 +++ b/net/core/Makefile 2008-11-21 13:32:30.000000000 -0800 @@ -17,3 +17,4 @@ obj-$(CONFIG_NET_PKTGEN) += pktgen.o obj-$(CONFIG_NETPOLL) += netpoll.o obj-$(CONFIG_NET_DMA) += user_dma.o obj-$(CONFIG_FIB_RULES) += fib_rules.o +obj-$(CONFIG_HOTPLUG) += uevent.o --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ b/net/core/uevent.c 2008-11-21 13:42:13.000000000 -0800 @@ -0,0 +1,45 @@ +/* + * Linux network device event notification + * + * Author: + * Stephen Hemminger <shemminger@vyatta.com> + */ + +#include <linux/kernel.h> +#include <linux/netdevice.h> +#include <linux/kobject.h> +#include <linux/notifier.h> + +static int netdev_event(struct notifier_block *this, unsigned long event, void *ptr) +{ + struct net_device *netdev = ptr; + + switch (event) { + case NETDEV_UNREGISTER: + kobject_uevent(&netdev->dev.kobj, KOBJ_REMOVE); + break; + case NETDEV_REGISTER: + kobject_uevent(&netdev->dev.kobj, KOBJ_ADD); + break; + case NETDEV_UP: + kobject_uevent(&netdev->dev.kobj, KOBJ_ONLINE); + break; + case NETDEV_DOWN: + kobject_uevent(&netdev->dev.kobj, KOBJ_OFFLINE); + break; + case NETDEV_CHANGE: + kobject_uevent(&netdev->dev.kobj, KOBJ_CHANGE); + break; + } + return NOTIFY_DONE; +} + +static struct notifier_block netdev_uevent_notifier = { + .notifier_call = netdev_event, +}; + +static int __init netdev_uevent_init(void) +{ + return register_netdevice_notifier(&netdev_uevent_notifier); +} +device_initcall(netdev_uevent_init);