[PATCH] netdev/uevent

From: Thomas Ogrisegg
Date: Tue Feb 21 2006 - 18:46:09 EST


This patch adds userspace notification for register/unregister and
plug/unplug events for netdevices. It calls kobject_uevent to let
userspace applications (via netlink-interface) know that e.g. the
ethernet-cable was plugged in (or plugged out) and thus the ethernet
device may have to be reconfigured.

Common scenario:
A userspace application is notified that the ethernet cable was plugged
out and later plugged in. It now checks whether the ethernet card is now
connected to an other network and reassigns it's IP-Address via DHCP.

BTW: Of course I know that the constant KOBJ_ONLINE actually has an other
meaning than what I used it for. I just didn't want to introduce a new
constant and it just seems perfect for my purpose.

Signed-off-by: Thomas Ogrisegg <tom-lkml@xxxxxxxxxxxxx>
diff -uNr -X linux-2.6.15/Documentation/dontdiff linux-2.6.15/net/core/dev.c linux-2.6.15.4/net/core/dev.c
--- linux-2.6.15/net/core/dev.c 2006-01-03 04:21:10.000000000 +0100
+++ linux-2.6.15.4/net/core/dev.c 2006-02-21 20:14:27.000000000 +0100
@@ -104,6 +104,7 @@
#include <linux/highmem.h>
#include <linux/init.h>
#include <linux/kmod.h>
+#include <linux/kobject_uevent.h>
#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/netpoll.h>
@@ -742,6 +743,34 @@
}

/**
+ * netdev_uevent - notify userspace of netdev events
+ * @dev: device
+ * @event: event for device
+ *
+ * Called to notify userspace of (de-)registering and status events
+ * of netdevices
+ */
+static inline void
+netdev_uevent(struct net_device *dev, int event)
+{
+ kobject_action_t action = 0;
+
+ switch (event) {
+ case NETDEV_CHANGE:
+ action = netif_carrier_ok (dev) ? KOBJ_ONLINE : KOBJ_OFFLINE;
+ break;
+ case NETDEV_REGISTER:
+ action = KOBJ_ADD;
+ break;
+ case NETDEV_UNREGISTER:
+ action = KOBJ_REMOVE;
+ break;
+ }
+ if (action)
+ kobject_uevent (&dev->class_dev.kobj, action, NULL);
+}
+
+/**
* netdev_features_change - device changes fatures
* @dev: device to cause notification
*
@@ -765,6 +794,7 @@
{
if (dev->flags & IFF_UP) {
notifier_call_chain(&netdev_chain, NETDEV_CHANGE, dev);
+ netdev_uevent(dev, NETDEV_CHANGE);
rtmsg_ifinfo(RTM_NEWLINK, dev, 0);
}
}
@@ -2937,6 +2967,7 @@
if (err)
printk(KERN_ERR "%s: failed sysfs registration (%d)\n",
dev->name, err);
+ netdev_uevent (dev, NETDEV_REGISTER);
dev->reg_state = NETREG_REGISTERED;
break;

@@ -3108,6 +3139,7 @@
this device. They should clean all the things.
*/
notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
+ netdev_uevent (dev, NETDEV_UNREGISTER);

/*
* Flush the multicast chain