|
@@ -80,6 +80,33 @@ static struct netconsole_target default_target = {
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/* Handle network interface device notifications */
|
|
|
|
+static int netconsole_netdev_event(struct notifier_block *this,
|
|
|
|
+ unsigned long event,
|
|
|
|
+ void *ptr)
|
|
|
|
+{
|
|
|
|
+ struct net_device *dev = ptr;
|
|
|
|
+ struct netconsole_target *nt = &default_target;
|
|
|
|
+
|
|
|
|
+ if (nt->np.dev == dev) {
|
|
|
|
+ switch (event) {
|
|
|
|
+ case NETDEV_CHANGEADDR:
|
|
|
|
+ memcpy(nt->np.local_mac, dev->dev_addr, ETH_ALEN);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case NETDEV_CHANGENAME:
|
|
|
|
+ strlcpy(nt->np.dev_name, dev->name, IFNAMSIZ);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return NOTIFY_DONE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct notifier_block netconsole_netdev_notifier = {
|
|
|
|
+ .notifier_call = netconsole_netdev_event,
|
|
|
|
+};
|
|
|
|
+
|
|
static void write_msg(struct console *con, const char *msg, unsigned int len)
|
|
static void write_msg(struct console *con, const char *msg, unsigned int len)
|
|
{
|
|
{
|
|
int frag, left;
|
|
int frag, left;
|
|
@@ -122,6 +149,10 @@ static int __init init_netconsole(void)
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
|
|
+ err = register_netdevice_notifier(&netconsole_netdev_notifier);
|
|
|
|
+ if (err)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
register_console(&netconsole);
|
|
register_console(&netconsole);
|
|
printk(KERN_INFO "netconsole: network logging started\n");
|
|
printk(KERN_INFO "netconsole: network logging started\n");
|
|
|
|
|
|
@@ -134,6 +165,7 @@ static void __exit cleanup_netconsole(void)
|
|
struct netconsole_target *nt = &default_target;
|
|
struct netconsole_target *nt = &default_target;
|
|
|
|
|
|
unregister_console(&netconsole);
|
|
unregister_console(&netconsole);
|
|
|
|
+ unregister_netdevice_notifier(&netconsole_netdev_notifier);
|
|
netpoll_cleanup(&nt->np);
|
|
netpoll_cleanup(&nt->np);
|
|
}
|
|
}
|
|
|
|
|