diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 87d2046..fdc5a8a 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -128,5 +128,12 @@ config LEDS_TRIGGER_HEARTBEAT load average. If unsure, say Y. +config LEDS_TRIGGER_NETWORK_ACT + tristate "LED Network Activity Trigger" + depends on LEDS_TRIGGERS && NET + help + This allow LEDs to be controlled by network activity at layer-3 networking. + If unsure, say Y. + endmenu diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index aa2c18e..bc899d3 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -21,3 +21,4 @@ obj-$(CONFIG_LEDS_COBALT) += leds-cobalt.o obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) += ledtrig-ide-disk.o obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) += ledtrig-heartbeat.o +obj-$(CONFIG_LEDS_TRIGGER_NETWORK_ACT) += ledtrig-network-activity.o diff --git a/drivers/leds/ledtrig-network-activity.c b/drivers/leds/ledtrig-network-activity.c new file mode 100644 index 0000000..5c2e051 --- /dev/null +++ b/drivers/leds/ledtrig-network-activity.c @@ -0,0 +1,63 @@ +/* + * LED Network Activity Trigger + * + * based on ledtrig-ide-disk by Richard Purdie + * + * Copyright 2007 Florian Fainelli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include + +static void ledtrig_network_timerfunc(unsigned long data); + +DEFINE_LED_TRIGGER(ledtrig_network); +static DEFINE_TIMER(ledtrig_network_timer, ledtrig_network_timerfunc, 0, 0); +static int network_activity; +static int network_lastactivity; + +void ledtrig_network_activity(void) +{ + network_activity++; + if (!timer_pending(&ledtrig_network_timer)) + mod_timer(&ledtrig_network_timer, jiffies + msecs_to_jiffies(10)); +} +EXPORT_SYMBOL(ledtrig_network_activity); + +static void ledtrig_network_timerfunc(unsigned long data) +{ + if (network_lastactivity != network_activity) { + network_lastactivity = network_activity; + led_trigger_event(ledtrig_network, LED_FULL); + mod_timer(&ledtrig_network_timer, jiffies + msecs_to_jiffies(10)); + } else { + led_trigger_event(ledtrig_network, LED_OFF); + } +} + +static int __init ledtrig_network_init(void) +{ + led_trigger_register_simple("network-activity", &ledtrig_network); + return 0; +} + +static void __exit ledtrig_network_exit(void) +{ + led_trigger_unregister_simple(ledtrig_network); +} + +module_init(ledtrig_network_init); +module_exit(ledtrig_network_exit); + +MODULE_AUTHOR("Florian Fainelli "); +MODULE_DESCRIPTION("LED Network Activity trigger"); +MODULE_LICENSE("GPL"); diff --git a/net/core/dev.c b/net/core/dev.c index ee051bb..a3a4115 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -117,6 +117,7 @@ #include #include #include +#include /* * The list of packet types we will receive (as opposed to discard) @@ -1523,6 +1524,7 @@ gso: * stops preemption for RCU. */ rcu_read_lock_bh(); + ledtrig_network_activity(); /* Updates of qdisc are serialized by queue_lock. * The struct Qdisc which is pointed to by qdisc is now a